使用前一个月作为“结束”,我需要一个语法来计算/聚合YTD和MTD的天数。例如,如果今天是3/6,那么YTD的计算应该是1/1/2019到2/28/2019。同样,MTD的计算应为2/1/2019至2/28/2019。如果今天是一月,MTD是12月1日-12月31日,YTD是1月1日-12月31日.
发布于 2019-02-28 22:22:46
不要去想一个时期的结束,想想下一个时期的开始。您希望在年初或之后(或前一个月),以及在本月底开始之前,一切都要完成。通过这种方式,您可以编写在列或参数的数据类型更改时不会受到舍入问题影响的查询。
就YTD而言:
DECLARE @thismonth date = DATEADD(DAY, 1-DAY(GETDATE()), GETDATE());
...
WHERE col >= DATEFROMPARTS(YEAR(DATEADD(MONTH, -1, @thismonth)), 1, 1)
AND col < @thismonth;中期发展:
DECLARE @thismonth date = DATEADD(DAY, 1-DAY(GETDATE()), GETDATE());
...
WHERE col >= DATEADD(MONTH, -1, @thismonth)
AND col < @thismonth;如果你只需要数一数,那就是
-- YTD
SELECT DATEDIFF
(
DAY,
DATEFROMPARTS(YEAR(DATEADD(MONTH, -1, @thismonth)), 1, 1),
@thismonth
);
-- MTD
SELECT DATEDIFF
(
DAY,
DATEADD(MONTH, -1, @thismonth),
@thismonth
);关于四舍五入问题的一些背景知识,以及为什么不想计算期间的“结束”或使用BETWEEN进行日期范围查询的原因:
https://dba.stackexchange.com/questions/231005
复制相似问题