我需要将日期部分添加GetDate()
到存储的时间部分DateTime
。
天真地我以为我可以做到以下几点:
declare @testTime DateTime = '2013-04-23 13:55:06'
select cast(getdate() as date) + cast(@testTime as time)
但这会出现以下错误:
操作数数据类型 date 对于 add 运算符无效。
我做了更多的研究,并提出了三种可能的计算方法:
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)
更新:
您的前两个查询。
要求数据库兼容级别为 SQL Server 2008(100)。如果它们以兼容级别 (110) 或 (120) 执行,您将获得
所以你根本不应该考虑这些。
最后查询
工作得很好。
我在 SQL Server 2014 中做了超过 1000000 行的测试,该
datetimefromparts
版本耗时 650 毫秒,dateadd/datediff
耗时 350 毫秒。仅在 SQL 2005 上测试:
为什么,怎么办?
有些人会争辩说我不应该依赖代码中未记录的数据结构内部结构。这可能是真的。但如果出于某种原因性能足够重要,我认为 CAST应该更快。我没有做任何计时。