我目前正在使用Ben-Gan,Itzik这本书学习SQL Server。 T-SQL基础知识。以下是用于选择月末下订单的查询。 (我知道也可以使用函数EOMONTH())
SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
WHERE orderdate = DATEADD( month, DATEDIFF( month, '18991231', orderdate), '18991231');
作者的解释是:
该表达式首先计算整体的差异 在一个月的最后一天(1899年12月31日,在 这种情况)和指定的日期。称之为差异差异。通过 将差异月份添加到锚定日期,您将获得最后一天 目标月份。
然而,我仍然对其实际运作方式感到困惑。有人会好心解释一下吗?
答案 0 :(得分:3)
这似乎是一种相当神秘的方式。代码正在做的是计算自某个月的最后一天以来的月数。然后,它将该月数添加到该日期。由于dateadd()
的规则,月份仍然是最后一个日期。
但是,我更喜欢更简单的方法:
where day(dateadd(day, 1, orderdate)) = 1
我发现这个更清楚了。
答案 1 :(得分:1)
select DATEDIFF(MONTH, '20160131', '20160201')
给我们1个月和
SELECT DATEADD(month, 1, '20160131')
给我们2016-02-29 00:00:00.000
没关系
答案 2 :(得分:0)
我自己尝试了查询,似乎已经掌握了它。这是我写的,以防其他人感兴趣
SELECT DATEADD(month, DATEDIFF(MONTH, '20160131', '20160201'), '20160131');
结果:
2016-02-29 00:00:00.000
所以我的解释是添加一个或多个"月"到该月的最后一个日期为31的特定日期将始终返回该日期是该月的最后一天的日期。如果这句话有意义......