1

我在试图修复的 SQL 报告中遇到了这行代码。有人可以告诉我这样做的目的是什么。

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

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

4

4 回答 4

6

它可能是为 SQL Server 2005 编写的,当时CONVERT(DATE在某些 Microsoft 员工眼中只是微光,当我们不得不使用繁琐、低效且难以解释的变通方法来删除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;

因为,虽然 sargable,但该表达式仍然会导致相当差的基数估计。有关更多信息,请参阅这篇非常详尽的帖子:

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

于 2013-12-13T19:41:40.237 回答
5

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

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

于 2013-12-13T19:37:26.330 回答
1

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

于 2013-12-13T19:41:22.227 回答
1

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

SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate]
于 2013-12-13T19:43:02.250 回答