计算月末的订单

时间:2016-10-27 23:34:08

标签: sql sql-server tsql

我目前正在使用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日,在   这种情况)和指定的日期。称之为差异差异。通过   将差异月份添加到锚定日期,您将获得最后一天   目标月份。

然而,我仍然对其实际运作方式感到困惑。有人会好心解释一下吗?

3 个答案:

答案 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的特定日期将始终返回该日期是该月的最后一天的日期。如果这句话有意义......