我在SQL报告中遇到这条代码,我试图修复。有人可以告诉我这是什么目的。为什么有人会用这个?
DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate
对我来说,它似乎会取消自己。
我在SQL报告中遇到这条代码,我试图修复。有人可以告诉我这是什么目的。为什么有人会用这个?
DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate
对我来说,它似乎会取消自己。
它将删除DATETIME
的TIME
部分而不更改数据类型。 您可以观察到不同的行为在这里:SQL Fiddle
同样,不知道为什么你需要保持DATETIME
型,同时消除了时间,除非它先于DATE
数据类型。
Date
数据类型已添加到SQL 2008 per MSDN中。在SQL 2008之前,此公式是截断DateTime
变量的时间的一种方法。
它很可能是为SQL Server 2005编写的,当时CONVERT(DATE
只是微软员工眼中的一丝曙光,而且我们不得不使用繁琐,低效和难以解释的解决方法来删除DATETIME
的时间部分。
当然,人们仍然使用那些繁琐,高效且难以解释的方法。但我不认为这里有人会告诉你为什么,特别是如果你正在寻找特定开发人员在特定情况下选择特定格式的原因。我们根本无法为他们说话。也许他们把它从别的地方偷走了,也许这对他们来说实际上是有意义的,也许他们只是在不知道它做什么的情况下插入它。
今天,更好的办法是:
CONVERT(DATE, d.TxnDateTime);
,如果你试图让所有的行,其中d.TxnDateTime
落在某一天,一个更好的方法是使用一个DATE
参数,以及开放式的范围查询:
WHERE d.TxnDateTime >= @ThatDay
AND d.TxnDateTime < DATEADD(DAY, 1, @ThatDay);
这优于:
WHERE CONVERT(DATE, d.TxnDateTime) = @ThatDay;
因为,尽管这个表达式仍然可以导致相当差的基数估计值,欲了解更多信息,请参阅本非常彻底职位:
https://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-but-is-it-a-good-idea
也可能不是一个坏主意,阅读这一个:
而且还这对于dd
:
看来以前的代码作者是试图将DATETIME对象转换为DATE对象......基本上删除时间组件(HH:MM:SS)。更常见的方法是:
SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate]
将DATETIME转换为DATE懒惰? – Joe
更好的方法是'cast(d.TxnDateTime as Date)'。 –
+1为迄今为止施放的独特方式。 –