我经常看到用DATEADD
和DATEDIFF
在WHERE
子句中定义范围、将日期时间展平为 0 小时或查找一个月或一年的最后一天的查询,但我不明白所有部分是如何工作的。
例如,这将查找从当天开始到 30 天前开始的日期。
SELECT *
FROM tbl
WHERE datecol >= DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)
AND datecol < DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);
这一切的不同部分完成了什么?
了解日期数学如何工作的最佳方法是将查询分解为各个部分。
从这个开始:
在这一天,它返回
2017-10-04 19:34:20.050
。在日期数学中,数字 0 和日期 1900-01-01 可以互换。
这意味着您几乎可以将任何数字转换为日期。甚至是负数。
这将带回
1899-12-31 00:00:00.000
,这与此相同:只需从 1900-01-01 中减去一天。很奇怪,对吧?
这对我们有什么帮助?
让我们看看我们原来的查询:
这给了我们
1900-01-01
与当前日期之间的天数。这意味着完整的表达:是将
1900-01-01
和 当前之间的天数添加到1900-01-01
。这给了我们当天的开始时间,即 0 小时。第二部分做同样的事情,除了从
1900-01-01
0 小时减去 30 天。如果这太多了,我完全理解。
有关重要日期计算的备忘单,请参阅Tim Ford 的文章。
有关重要日期的日历表,请参阅Aaron Bertrand 的文章。