SQL Server:每月的第一个工作日

问题描述 投票:1回答:1

如何将假日表合并到下面的SQL中?结果返回第一个工作日,但自从1/1/18是星期一假期,我需要工作日2。

DECLARE @DATE DATETIME;
SET @DATE = '1/1/2018';

SELECT 
    CASE
       WHEN DATENAME(WEEKDAY, DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0)) = 'Saturday'
          THEN DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0) + 2
       WHEN DATENAME(WEEKDAY, DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0)) = 'Sunday'
          THEN DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0) + 2
       WHEN DATENAME(WEEKDAY, DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0)) = 'Monday'
          THEN DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0) + 1
       ELSE DATEADD(mm, DATEDIFF(MM, 0, @DATE), 0)
   END;
sql-server
1个回答
0
投票

我想这会对你有所帮助,你可以检查这个sqlscript,我给你3个不同的日期来检查正确的答案:

Declare @date date = '01/01/2018' --getdate()

SELECT CASE 
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Saturday'
            THEN dateadd(mm, DATEDIFF(MM, 0, getdate()), 0) + 2
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Sunday'
            THEN dateadd(mm, DATEDIFF(MM, 0, @date), 0) + 1
        ELSE dateadd(mm, DATEDIFF(MM, 0, @date), 0)
        END

set @date = '04/01/2018' --getdate()

SELECT CASE 
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Saturday'
            THEN dateadd(mm, DATEDIFF(MM, 0, getdate()), 0) + 2
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Sunday'
            THEN dateadd(mm, DATEDIFF(MM, 0, @date), 0) + 1
        ELSE dateadd(mm, DATEDIFF(MM, 0, @date), 0)
        END

set @date = '09/01/2018' --getdate()

SELECT CASE 
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Saturday'
            THEN dateadd(mm, DATEDIFF(MM, 0, getdate()), 0) + 2
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, @date), 0)) = 'Sunday'
            THEN dateadd(mm, DATEDIFF(MM, 0, @date), 0) + 1
        ELSE dateadd(mm, DATEDIFF(MM, 0, @date), 0)
        END

请参考: - First business day of the current month - SQL Server

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