我正在创建一个存储过程,它将从今年和前一年提取值。如果需要使用当年的日期,则需要将值归入周末到周末之前或周末之后的值。
目前,这是我的查询:
SELECT *
FROM
(
SELECT
CAST(@PassedString AS datetime) AS SelectedMonth,
SUM(CASE WHEN Year(PD.PDate) = @CurrYear THEN
ISNULL(PD.PQO, PD.PQty) END) AS CurrQty,
SUM(CASE WHEN Year(PD.PDate) = @PrevYear THEN
ISNULL(PD.PQO, PD.PQty) END) AS PrevQty,
CAST(DATEPART(day, PD.PDate) AS varchar(50)) + '-' +
CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS
varchar(3)) AS PDayMonth,
CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS
varchar(3)) AS PMonth,
CAST(DATEPART(day, PD.PDate) AS int) AS PDay
FROM TableXYZ AS PD
WHERE DATEPART(month, PD.PDate) = @getMonth
AND DATEPART(year, PD.PDate) IN (@CurrYear, @PrevYear)
GROUP BY CAST(DATEPART(day, PD.PDate) AS int),
CAST(CONVERT(varchar(3), DATENAME(month, PD.PDate)) AS varchar(3))
) AS PQtyGroup
结果如下:
SelectedMonth CurrQty PrevQty DayMo Mon Date
------------------------------------------------------
2018-08-01 00:00:00.000 146231 150873 1-Aug Aug 1
2018-08-01 00:00:00.000 143712 155624 2-Aug Aug 2
2018-08-01 00:00:00.000 139729 141820 3-Aug Aug 3
2018-08-01 00:00:00.000 43075 141318 4-Aug Aug 4
2018-08-01 00:00:00.000 17303 52898 5-Aug Aug 5
2018-08-01 00:00:00.000 139725 17336 6-Aug Aug 6
2018-08-01 00:00:00.000 146914 136205 7-Aug Aug 7
2018-08-01 00:00:00.000 146662 147549 8-Aug Aug 8
2018-08-01 00:00:00.000 148166 139434 9-Aug Aug 9
2018-08-01 00:00:00.000 130704 149717 10-Aug Aug 10
如何排除今年的周末?如果我使用类似下面的内容,由于它是2017年的星期五,它将仍然显示2018年8月4日:
WHERE ((DATEPART(dw, PD.PDate) + @@DATEFIRST) % 7) NOT IN (0, 1)
假设当前年份为2018年,上一年为2017年。2018年8月4日至5日为周末。对于8月4日,它必须加到上一个日期(8月3日)和8月5日到8月6日。但是,对于上一年,需要将8月4日和5日都加到8月6日的值上(请参见下文)。我一直在为此绞尽脑汁,做了一些研究,但发现没有任何用处。
我希望最终输出像这样:
CurrQty 2018 PrevQty
---------------------------
146231 1-Aug 150873
143712 2-Aug 155624
182801 3-Aug 141820 *CurrQty: Aug 3 + Aug 4
157028 6-Aug 211522 *CurrQty: Aug 5 + Aug 6; PrevQty: Aug 4 + 5 + 6
146914 7-Aug 136205
146662 8-Aug 147549
148166 9-Aug 139434
130704 10-Aug 149717
感谢您的帮助!谢谢!