从 SQL Server 中的日期时间字段中删除时间部分时,哪种方法可提供最佳性能?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
或者
b) select cast(convert(char(11), getdate(), 113) as datetime)
第二种方法确实会多发送几个字节,但这可能不如转换速度重要。
两者看起来也都非常快,但是在处理数十万或更多行时速度可能会有所不同?
另外,是否有更好的方法可以摆脱 SQL 中日期时间的时间部分?
严格来说,方法a
是资源最少的:
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
已经证明在相同的总持续时间一百万行内占用更少的 CPU 密集度被手上有太多时间的人证明:SQL Server 中从日期+时间获取日期的最有效方法?
我在其他地方也看到过类似的测试,结果也类似。
我更喜欢 DATEADD/DATEDIFF 因为:
编辑,2011 年 10 月
对于SQL Server 2008+,你可以同时投射到date
即CAST(getdate() AS date)
。或者只是使用date
数据类型,所以不要time
删除。
编辑,2012 年 1 月
这是多么灵活的一个工作示例:需要在 sql server 中按四舍五入的时间或日期数字计算
编辑,2012 年 5 月
不要在 WHERE 子句等中不加考虑地使用它:向列添加函数或 CAST 会使索引使用无效。请参阅此处的第 2 条常见 SQL 编程错误
现在,这确实有一个更高版本的 SQL Server 优化器版本正确管理 CAST 的示例,但通常这将是一个坏主意......
编辑,2018 年 9 月,日期时间 2
DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'
select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
@David Sopko 为 2011 年 10 月编辑然后代码是: select cast(GETDATE() as date)
对于更新的 SQL 版本,使用日期而不是日期时间可以避免处理小时数的需要。使用以下示例:declare noTime date = getdate(), withTime datetime = getdate() select @noTime,@withTime
如果您只需要日期,则作为日期的演员表很棒。然而,您经常需要午夜的当前日期,以便您可以进行一些进一步的日期操作。该
DATE
数据时间是在什么它会让你对于喜欢的东西DATEADD,DATEDIFF和互动与其他日期/时间数据类型做令人讨厌的限制。对于这些情况,DATEADD()
方法为王。这并不适用于每个日期。我错误地输入
0218
而不是2018
年份,并且DATEDIFF
您的语句部分引发异常The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range datetime value
尝试:select DATEDIFF(dd, 0, convert(datetime2(0), '0218-09-12', 120))
@BernhardDöbler 于 2009 年 7 月回答时,“0218”将是一个有效日期,因此您不会走到这一步。对于 datetime2,“0”也不会转换为 19000101。试试这个选择
SELECT DATEDIFF(dd, '19000101', convert(datetime2(0), '0218-09-12', 120))