Count work days between two dates

前端 未结 24 2694
失恋的感觉
失恋的感觉 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:49

    I took the various examples here, but in my particular situation we have a @PromisedDate for delivery and a @ReceivedDate for the actual receipt of the item. When an item was received before the "PromisedDate" the calculations were not totaling correctly unless I ordered the dates passed into the function by calendar order. Not wanting to check the dates every time, I changed the function to handle this for me.

    Create FUNCTION [dbo].[fnGetBusinessDays]
    (
     @PromiseDate date,
     @ReceivedDate date
    )
    RETURNS integer
    AS
    BEGIN
     DECLARE @days integer
    
     SELECT @days = 
        Case when @PromiseDate > @ReceivedDate Then
            DATEDIFF(d,@PromiseDate,@ReceivedDate) + 
            ABS(DATEDIFF(wk,@PromiseDate,@ReceivedDate)) * 2 +
            CASE 
                WHEN DATENAME(dw, @PromiseDate) <> 'Saturday' AND DATENAME(dw, @ReceivedDate) = 'Saturday' THEN 1 
                WHEN DATENAME(dw, @PromiseDate) = 'Saturday' AND DATENAME(dw, @ReceivedDate) <> 'Saturday' THEN -1 
                ELSE 0
            END +
            (Select COUNT(*) FROM CompanyHolidays 
                WHERE HolidayDate BETWEEN @ReceivedDate AND @PromiseDate 
                AND DATENAME(dw, HolidayDate) <> 'Saturday' AND DATENAME(dw, HolidayDate) <> 'Sunday')
        Else
            DATEDIFF(d,@PromiseDate,@ReceivedDate)  -
            ABS(DATEDIFF(wk,@PromiseDate,@ReceivedDate)) * 2  -
                CASE 
                    WHEN DATENAME(dw, @PromiseDate) <> 'Saturday' AND DATENAME(dw, @ReceivedDate) = 'Saturday' THEN 1 
                    WHEN DATENAME(dw, @PromiseDate) = 'Saturday' AND DATENAME(dw, @ReceivedDate) <> 'Saturday' THEN -1 
                    ELSE 0
                END -
            (Select COUNT(*) FROM CompanyHolidays 
                WHERE HolidayDate BETWEEN @PromiseDate and @ReceivedDate 
                AND DATENAME(dw, HolidayDate) <> 'Saturday' AND DATENAME(dw, HolidayDate) <> 'Sunday')
        End
    
    
     RETURN (@days)
    
    END
    

提交回复
热议问题