例如,我们有2017年,2018年和2019年的数据。如果我在2019年1月,我想要上一季度和上个月的数据。
我的查询是这样的:
Select
(case
When month(datecolumn) = month(getdate()) - 1
then sales
else 0
end) as premonthsales,
(case
when datepart(qq, datecolumn) = datepart(qq, getdate()) - 1
then sales
else 0
end) as lq sales
from
t
当我在2019年1月时,它向我显示了2017年12月和2018年的数据。我希望它像我在 2018 年 1 月一样动态,它应该只显示上个月和最后一个季度(2017 年第 4 季度(的 2017 年 12 月数据。
如果您刚刚结束上一季度,只需使用基本的日期逻辑即可。但是,这是伪 SQL:
SELECT ...
FROM ...
WHERE DateColumn >= DATEADD(QUARTER(DATEDIFF(QUARTER,0,GETDATE())-1,0)
AND DateColumn < DATEADD(QUARTER(DATEDIFF(QUARTER,0,GETDATE()),0);
对于 19 年 1 月,18 年 12 月已经在上一季度,因此您不需要额外的逻辑。
若要在 SQL Server 中获取上一季度的第一天,请使用以下代码:
SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) - 1, 0)
要获取上一季度的最后一天,请执行以下操作:
SELECT DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0))
要获取当前季度的第一天,请执行以下操作:
SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)
您可以获得所有日期,根据获得的日期对数据应用过滤器以获得正确的结果。
SELECT ...
FROM ...
WHERE DateColumn between start_date and end_date;
源
你也应该包括YEAR
SELECT
(CASE WHEN MONTH(datecolumn) = MONTH (GETDATE()) - 1 AND YEAR(datecolumn) = YEAR(GETDATE()) - 1 THEN sales ELSE 0 END) AS premonthsales ,
(CASE WHEN DATEPART(qq,datecolumn) = DATEPART(qq,GETDATE()) - 1 AND AND YEAR(datecolumn) = YEAR(GETDATE()) - 1 THEN Sales ELSE 0 END) AS lq sales
FROM t