sql - SQL - 在 WHERE 子句中使用计算日期
问题描述
我有一张包含未来值的表格,我只想要最后一周。
意思是 af 想要找到最后一个星期日并有一个 WHERE 子句,其中日期在“上周日 - 7”和“上周日”之间。
这意味着我在“2018 年 10 月 31 日”之前有交易,并且想要“2018 年 10 月 28 日”和“2018 年 10 月 22 日”之间的时间段(包括这两天)。但是每周都会不断添加新数据,所以很快我就有数据,直到'2018-11-30'等等。
我试过这样的查询:
SELECT *
FROM PlannedCounts
WHERE [Date] BETWEEN DATEADD(d,-6,MAX([Date])) and MAX([Date])
注意:我知道这只会给我最后一天('2018-10-31' 而不是上周日)。
如何在我的 where 条款中包含计算日期,并将目标日期设置为上周日?
我的表有以下列:
Date
Location
Type
Material
Value
Manager
解决方案
对于给定的日期2018-10-31
,您需要确定星期几(1 ... 7),以便您可以计算上一个星期日。不幸的是,这不是直截了当的(见讨论):
CREATE TABLE #PlannedCounts(Date Date);
INSERT INTO #PlannedCounts(Date) VALUES
('2018-10-31'),
('2018-10-30'),
('2018-10-29'),
('2018-10-28'),
('2018-10-27'),
('2018-10-26'),
('2018-10-25'),
('2018-10-24'),
('2018-10-23'),
('2018-10-22'),
('2018-10-21'),
('2018-10-20'),
('2018-10-19'),
('2018-10-18'),
('2018-10-17'),
('2018-10-16'),
('2018-10-15'),
('2018-10-14'),
('2018-10-13'),
('2018-10-12');
DECLARE @LastSunday AS DATE;
DECLARE @PrevSunday AS DATE;
SELECT
@LastSunday = DATEADD(DAY, -(@@DATEFIRST + DATEPART(dw, MAX(Date)) - 1) % 7 - 0, MAX(Date)),
@PrevSunday = DATEADD(DAY, -(@@DATEFIRST + DATEPART(dw, MAX(Date)) - 1) % 7 - 6, MAX(Date))
FROM #PlannedCounts
-- @LastSunday = 2018-10-28
-- @PrevSunday = 2018-10-22
SELECT *
FROM #PlannedCounts
WHERE Date BETWEEN @PrevSunday AND @LastSunday
注意:可以用查询替换用户变量。