T SQL日期范围之间的第一个星期二

问题描述 投票:0回答:3

使用SQL Server,我需要计算“桶开始”日期和“桶结束”日期之间的第一个星期二。但是,我的代码返回错误的日期。

这是我的代码:

SELECT 
    CONVERT(DATETIME, CONVERT(VARCHAR(10), [BUCKET_START])) AS  Bucket_Start,
    CONVERT(DATETIME, CONVERT(VARCHAR(10), [BUCKET_END])) AS Bucket_End,
    DATEADD(dd, - 6, DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 7 - DATEPART(day, CONVERT(DATETIME, CONVERT(VARCHAR(10), [BUCKET_START]))),   
    CONVERT(DATETIME, CONVERT(VARCHAR(10), [BUCKET_END])))), 0)) AS [1st_Tuesday]
FROM 
    [BUCKETS]
WHERE 
    CAT_CODE = 1013
    AND BUCKET_START < CONVERT(NVARCHAR, GETDATE(), 112)
    AND BUCKET_END > CONVERT(NVARCHAR, GETDATE(), 112)

这些是目前的结果:

Bucket_Start      Bucket_End      1st_Tuesday
2019-03-31        2019-04-27      2019-03-26

但是,正确的1st_Tuesday是:

Bucket_Start      Bucket_End      1st_Tuesday
2019-03-31        2019-04-27      2019-04-02

为什么我的查询仍在三月查看?

谢谢你的帮助。

sql-server tsql date dateadd
3个回答
0
投票

我们可以通过使用case语句来实现这一点。

    SELECT 
CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])) AS Bucket_Start,
CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_END])) AS Bucket_End,
case when     abs((select  DATEparT(weekday  ,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))))) in  (1,2,3)
                  then    DATEadd(weekday,  3 -  abs((select  DATEparT(weekday  ,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))))), CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
                  else   DATEadd(weekday,  3 + ( 7 - abs((select  DATEparT(weekday  ,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))))), CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))  
                  end AS [1st_Tuesday]
FROM [BUCKETS]
WHERE   BUCKET_START < CONVERT(NVARCHAR, GETDATE(), 112)
AND BUCKET_END > CONVERT(NVARCHAR, GETDATE(), 112)

0
投票

谢谢大家的帮助!我跟以下一起去了:

SELECT
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) as Bucket_Start_Day, 
CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])) AS Bucket_Start,
CASE
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Sunday' then 
DATEADD(DD,2,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Monday' then 
DATEADD(DD,1,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Tuesday' then 
CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Wednesday' then 
DATEADD(DD,6,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Thursday' then 
DATEADD(DD,5,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Friday' then 
DATEADD(DD,4,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
WHEN
DATENAME(dw,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START]))) = 'Saturday' then 
DATEADD(DD,4,CONVERT(DATETIME, convert(VARCHAR(10), [BUCKET_START])))
END AS '1st_Tuesday'
FROM [BUCKETS]
WHERE CAT_CODE = 1013
AND BUCKET_START < CONVERT(NVARCHAR, GETDATE(), 112)
AND BUCKET_END > CONVERT(NVARCHAR, GETDATE(), 112)

这给了我以下内容:

Bucket_Start_Day    Bucket_Start               1st_Tuesday
Sunday          2019-03-31 00:00:00.000    2019-04-02 00:00:00.000

0
投票

如果是星期三,则添加6天到桶开始,如果是星期四,则添加5天,...,如果是星期二,则添加0。

SELECT Bucket_Start, DATEADD(DAY, CASE DATENAME(WEEKDAY, Bucket_Start_Date)
    WHEN 'Wednesday' THEN 6
    WHEN 'Thursday'  THEN 5
    WHEN 'Friday'    THEN 4
    WHEN 'Saturday'  THEN 3
    WHEN 'Sunday'    THEN 2
    WHEN 'Monday'    THEN 1
    WHEN 'Tuesday'   THEN 0
END, Bucket_Start_Date) AS First_Tuesday
FROM Buckets
CROSS APPLY (
    -- convert int 20190301 to date
    SELECT CAST(CAST(Bucket_Start AS VARCHAR(8)) AS DATE) AS Bucket_Start_Date
) AS CA

0
投票

这不是您要求的,但我相信您可以使用它来获得您所需的结果。

DECLARE  @Day INT = 3;
 --Sunday    1
 --Monday    2
 --Tuesday   3
 --Wednesday 4
 --Thurday   5
 --Friday    6
 --Saturday  7 
 DECLARE  @StartDate DATETIME = GETDATE();

 SELECT  DATEADD(DD, @Day - DATEPART(WEEKDAY, @StartDate) + IIF(@Day - DATEPART(WEEKDAY, @StartDate) >= 0, 0, 7), @StartDate)

如果您希望下一个不包括今天,请更改> = to>

© www.soinside.com 2019 - 2024. All rights reserved.