为什么会有人使用它?

时间:2013-12-13 19:34:13

标签: sql sql-server-2008 tsql datediff dateadd

我在我试图解决的SQL报告中遇到了这行代码。有人能告诉我这是什么目的。

DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate

对我来说,它似乎会自行取消。

4 个答案:

答案 0 :(得分:6)

它可能是为SQL Server 2005编写的,当时CONVERT(DATE只是微软员工的一个亮点,当我们不得不使用繁琐,低效且难以解释的解决方法来删除时间部分时DATETIME

当然,人们仍然使用那些繁琐,有效且难以解释的方法。但我不认为这里的任何人可以告诉你原因,特别是如果你正在寻找特定开发人员在特定情况下选择特定格式的原因。我们根本无法代替他们。也许他们从其他地方偷了它,也许它实际上对他们有意义,也许他们只是插上它而不知道它的作用。

今天,更好的方法是:

CONVERT(DATE, d.TxnDateTime);

...我已多次证明这一点,包括herehere

现在,如果您尝试获取d.TxnDateTime落在特定日期的所有行,则更好的方法是使用DATE参数和开放式范围查询:< / p>

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

阅读本文也可能不是一个坏主意:

https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries

关于dd

也是如此

https://sqlblog.org/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations

答案 1 :(得分:5)

在不更改数据类型的情况下删除TIME的{​​{1}}部分。 您可以在此处观察不同的行为:SQL Fiddle

同样,不确定为什么在删除时间时需要保留DATETIME类型,除非它早于DATETIME数据类型。

答案 2 :(得分:1)

SQL 2008 per MSDN中添加了Date数据类型。在SQL 2008之前,此公式是从DateTime变量截断时间的一种方法。

答案 3 :(得分:1)

前面的代码作者似乎试图将DATETIME对象强制转换为DATE对象...基本上删除了时间组件(HH:MM:SS)。更常见的方法是:

SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate]