Calculate difference between 2 dates in SQL, excluding weekend days

前端 未结 10 1031
礼貌的吻别
礼貌的吻别 2020-12-04 01:34

I would like to build an SQL query which calculates the difference between 2 dates, without counting the week-end days in the result.

Is there any way to format the

10条回答
  •  误落风尘
    2020-12-04 02:10

    I've updated @JOpuckman's function to take into account that different regions don't always have a weekend of Saturday and Sunday. Here's the code in case anyone else needs to apply this globally;

    DECLARE @FirstDate DateTime
    DECLARE @SecondDate DateTime
    
    SET @FirstDate = '08-20-2012'
    SET @SecondDate = '08-24-2012'
    
    DECLARE @range INT;
    DECLARE @WeekendDayNameStart VARCHAR(50) 
    DECLARE @WeekendDayNameEnd VARCHAR(50)
    
    SET @WeekendDayNameStart = 'FRIDAY'
    SET @WeekendDayNameEnd = (
        SELECT CASE @WeekendDayNameStart
            WHEN 'SUNDAY' THEN 'MONDAY'
            WHEN 'MONDAY' THEN 'TUESDAY'
            WHEN 'TUESDAY' THEN 'WEDNESDAY'
            WHEN 'WEDNESDAY' THEN 'THURSDAY'
            WHEN 'THURSDAY' THEN 'FRIDAY'
            WHEN 'FRIDAY' THEN 'SATURDAY'
            WHEN 'SATURDAY' THEN 'SUNDAY'
        END
    )
    
    DECLARE @NumWorkDays INT
    
    SET @range = DATEDIFF(DAY, @FirstDate, @SecondDate); 
    SET @NumWorkDays = (
    SELECT  
    @range / 7 * 5 + @range % 7 - ( 
        SELECT COUNT(*)  
        FROM ( 
            SELECT 1 AS d 
            UNION ALL SELECT 2  
            UNION ALL SELECT 3  
            UNION ALL SELECT 4  
            UNION ALL SELECT 5  
            UNION ALL SELECT 6  
            UNION ALL SELECT 7 
            ) weekdays 
        WHERE d <= @range % 7  
        AND DATENAME(WEEKDAY, @SecondDate - d) IN (@WeekendDayNameStart, @WeekendDayNameEnd))
    );
    
    -- Calculate whether the current date is a working day
    DECLARE @CurDateExtra INT
    SET @CurDateExtra = 
    (
        CASE DATENAME(WEEKDAY, @SecondDate)
        WHEN @WeekendDayNameStart THEN 0
        WHEN @WeekendDayNameEnd THEN 0
        ELSE 1
        END
    )
    
    SET @NumWorkDays = @NumWorkDays + @CurDateExtra
    SELECT @NumWorkDays
    

提交回复
热议问题