Count work days between two dates

前端 未结 24 2988
失恋的感觉
失恋的感觉 2020-11-22 01:05

How can I calculate the number of work days between two dates in SQL Server?

Monday to Friday and it must be T-SQL.

24条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 01:39

    I borrowed some ideas from others to create my solution. I use inline code to ignore weekends and U.S. federal holidays. In my environment, EndDate may be null, but it will never precede StartDate.

    CREATE FUNCTION dbo.ufn_CalculateBusinessDays(
    @StartDate DATE,
    @EndDate DATE = NULL)
    
    RETURNS INT
    AS
    
    BEGIN
    DECLARE @TotalBusinessDays INT = 0;
    DECLARE @TestDate DATE = @StartDate;
    
    
    IF @EndDate IS NULL
        RETURN NULL;
    
    WHILE @TestDate < @EndDate
    BEGIN
        DECLARE @Month INT = DATEPART(MM, @TestDate);
        DECLARE @Day INT = DATEPART(DD, @TestDate);
        DECLARE @DayOfWeek INT = DATEPART(WEEKDAY, @TestDate) - 1; --Monday = 1, Tuesday = 2, etc.
        DECLARE @DayOccurrence INT = (@Day - 1) / 7 + 1; --Nth day of month (3rd Monday, for example)
    
        --Increment business day counter if not a weekend or holiday
        SELECT @TotalBusinessDays += (
            SELECT CASE
                --Saturday OR Sunday
                WHEN @DayOfWeek IN (6,7) THEN 0
                --New Year's Day
                WHEN @Month = 1 AND @Day = 1 THEN 0
                --MLK Jr. Day
                WHEN @Month = 1 AND @DayOfWeek = 1 AND @DayOccurrence = 3 THEN 0
                --G. Washington's Birthday
                WHEN @Month = 2 AND @DayOfWeek = 1 AND @DayOccurrence = 3 THEN 0
                --Memorial Day
                WHEN @Month = 5 AND @DayOfWeek = 1 AND @Day BETWEEN 25 AND 31 THEN 0
                --Independence Day
                WHEN @Month = 7 AND @Day = 4 THEN 0
                --Labor Day
                WHEN @Month = 9 AND @DayOfWeek = 1 AND @DayOccurrence = 1 THEN 0
                --Columbus Day
                WHEN @Month = 10 AND @DayOfWeek = 1 AND @DayOccurrence = 2 THEN 0
                --Veterans Day
                WHEN @Month = 11 AND @Day = 11 THEN 0
                --Thanksgiving
                WHEN @Month = 11 AND @DayOfWeek = 4 AND @DayOccurrence = 4 THEN 0
                --Christmas
                WHEN @Month = 12 AND @Day = 25 THEN 0
                ELSE 1
                END AS Result);
    
        SET @TestDate = DATEADD(dd, 1, @TestDate);
    END
    
    RETURN @TotalBusinessDays;
    END
    

提交回复
热议问题