Sql-Server

以下哪條 SQL 最有效

  • October 20, 2014

我需要將日期部分添加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 毫秒。

引用自:https://dba.stackexchange.com/questions/80059