Sql-Server
以下哪條 SQL 最有效
我需要將日期部分添加
GetDate()
到儲存的時間部分DateTime
。我天真地以為我可以做到以下幾點:
declare @testTime DateTime = '2013-04-23 13:55:06' select cast(getdate() as date) + cast(@testTime as time)
但這會產生以下錯誤:
操作數數據類型日期對於加法運算符無效。
我做了一些更多的研究,並提出了三種可能的計算方法:
declare @testTime DateTime = '2013-04-23 13:55:06' select dateadd(dd, 0, DATEDIFF(dd, 0, GetDate())) + cast(@testTime as time) select cast(cast(GetDate() as date) as datetime) + cast(@testTime as time) select dateadd(day, datediff(day, @testTime, GetDate()), @testTime)
這三種方法都產生相同的結果,但我對實施其中任何一種方法都不是 100% 滿意,儘管第三種方法似乎是更好的方法——儘管我沒有證據證明這一點。
三者中哪一個(如果有)是最有效的?
有沒有更好的辦法?
您可以使用DATETIMEFROMPARTS (Transact-SQL)
select datetimefromparts( datepart(year, getdate()), datepart(month, getdate()), datepart(day, getdate()), datepart(hour, @testTime), datepart(minute, @testTime), datepart(second, @testTime), datepart(millisecond, @testTime) )
更新:
您的前兩個查詢。
select dateadd(dd, 0, DATEDIFF(dd, 0, GetDate())) + cast(@testTime as time) select cast(cast(GetDate() as date) as datetime) + cast(@testTime as time)
要求數據庫兼容級別為 SQL Server 2008(100)。如果它們以兼容級別 (110) 或 (120) 執行,您將獲得
消息 402,級別 16,狀態 1,第 3 行數據類型 datetime 和 time 在 add 運算符中不兼容。
所以你根本不應該考慮這些。
最後一個查詢
select dateadd(day, datediff(day, @testTime, GetDate()), @testTime)
工作得很好。
我在 SQL Server 2014 中對超過 1000000 行進行了測試,
datetimefromparts
版本耗時 650 毫秒,dateadd/datediff
耗時 350 毫秒。