【问题标题】:SQL - using calculated dates in WHERE clauseSQL - 在 WHERE 子句中使用计算日期
【发布时间】:2018-09-06 23:00:33
【问题描述】:

我有一张包含未来值的表格,我只想要最后一整周。

意思是想要找到最后一个星期天,并且有一个 WHERE 子句,其中日期在“上星期天 - 7”和“上星期天”之间。

意思是我在“2018 年 10 月 10 日”之前有交易,并且想要“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

【问题讨论】:

  • 请提供您要查找的结果集。问题不清楚。
  • 是 SQL Server 吗?
  • 是的,它是和 SQL 服务器。

标签: sql sql-server date


【解决方案1】:

对于给定的日期2018-10-31,您需要确定星期几 (1 ... 7),以便计算上一个星期日。不幸的是,这不是直截了当的 (see discussion):

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

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

【讨论】:

    【解决方案2】:

    你需要一个case语句在where子句中——

    SELECT *
    FROM PlannedCounts
    WHERE [Date] >= CASE WHEN DAYNAME(MAX([Date])) = 'Monday' THEN 
                              DATEADD(d,-1,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Tuesday' THEN 
                              DATEADD(d,-2,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Wednesday' THEN 
                              DATEADD(d,-3,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Thursday' THEN 
                              DATEADD(d,-4,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Friday' THEN 
                              DATEADD(d,-5,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Saturday' THEN 
                              DATEADD(d,-6,MAX([Date]))
                     ELSE MAX([Date] END
    AND [Date] <= CASE WHEN DAYNAME(MAX([Date])) = 'Monday' THEN 
                              DATEADD(d,-7,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Tuesday' THEN 
                              DATEADD(d,-8,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Wednesday' THEN 
                              DATEADD(d,-9,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Thursday' THEN 
                              DATEADD(d,-10,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Friday' THEN 
                              DATEADD(d,-11,MAX([Date]))
                         WHEN DAYNAME(MAX([Date])) = 'Saturday' THEN 
                              DATEADD(d,-12,MAX([Date]))
                     ELSE DATEADD(d,-6,MAX([Date])) END
    

    【讨论】:

    • 也感谢您抽出宝贵时间回答我的问题。它非常有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2023-03-04
    • 2015-02-14
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多