Calculate the number of business days between two dates?

后端 未结 30 1741
悲&欢浪女
悲&欢浪女 2020-11-22 14:54

In C#, how can I calculate the number of business (or weekdays) days between two dates?

30条回答
  •  旧巷少年郎
    2020-11-22 15:54

    I was having trouble finding a solid TSQL version of this code. Below is essentially a conversion of the C# code here with addition of the Holiday table which should be used to pre-calculate holidays.

    CREATE TABLE dbo.Holiday
    (
        HolidayDt       DATE NOT NULL,
        Name            NVARCHAR(50) NOT NULL,
        IsWeekday       BIT NOT NULL,
        CONSTRAINT PK_Holiday PRIMARY KEY (HolidayDt)
    )
    GO
    CREATE INDEX IDX_Holiday ON Holiday (HolidayDt, IsWeekday)
    
    GO
    
    CREATE function dbo.GetBusinessDays
    (
         @FirstDay  datetime,
         @LastDay   datetime
    ) 
    RETURNS INT
     AS
    BEGIN
        DECLARE @BusinessDays INT, @FullWeekCount INT 
        SELECT  @FirstDay = CONVERT(DATETIME,CONVERT(DATE,@FirstDay))
            ,   @LastDay = CONVERT(DATETIME,CONVERT(DATE,@LastDay))
    
        IF @FirstDay > @LastDay
            RETURN NULL;
    
        SELECT @BusinessDays = DATEDIFF(DAY, @FirstDay, @LastDay) + 1 
        SELECT @FullWeekCount = @BusinessDays / 7;
    
        -- find out if there are weekends during the time exceedng the full weeks
        IF @BusinessDays > (@FullWeekCount * 7)
        BEGIN
        -- we are here to find out if there is a 1-day or 2-days weekend
        -- in the time interval remaining after subtracting the complete weeks
            DECLARE @firstDayOfWeek INT, @lastDayOfWeek INT;
            SELECT @firstDayOfWeek = DATEPART(DW, @FirstDay), @lastDayOfWeek = DATEPART(DW, @LastDay);
    
            IF @lastDayOfWeek < @firstDayOfWeek
                    SELECT @lastDayOfWeek = @lastDayOfWeek + 7;
    
            IF @firstDayOfWeek <= 6 
                BEGIN
                    IF (@lastDayOfWeek >= 7) --Both Saturday and Sunday are in the remaining time interval
                        BEGIN 
                            SELECT @BusinessDays = @BusinessDays - 2
                        END
                    ELSE IF @lastDayOfWeek>=6 --Only Saturday is in the remaining time interval
                        BEGIN
                            SELECT @BusinessDays = @BusinessDays - 1
                        END
    
                END
            ELSE IF @firstDayOfWeek <= 7 AND @lastDayOfWeek >=7 -- Only Sunday is in the remaining time interval
            BEGIN 
                SELECT @BusinessDays = @BusinessDays - 1
            END
        END
    
        -- subtract the weekends during the full weeks in the interval
        DECLARE @Holidays INT;
        SELECT  @Holidays = COUNT(*) 
        FROM    Holiday 
        WHERE   HolidayDt BETWEEN @FirstDay AND @LastDay 
        AND     IsWeekday = CAST(1 AS BIT)
    
        SELECT @BusinessDays = @BusinessDays - (@FullWeekCount + @FullWeekCount) -- - @Holidays
    
        RETURN @BusinessDays
    END
    

提交回复
热议问题