首页 > 解决方案 > 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

我的数据集和预期结果的图片

标签: sqlsql-serverdate

解决方案


对于给定的日期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

注意:可以用查询替换用户变量。


推荐阅读