Calculate business hours between two dates

前端 未结 14 1343
被撕碎了的回忆
被撕碎了的回忆 2020-11-27 05:06

How can I calculate business hours between two dates? For example we have two dates; 01/01/2010 15:00 and 04/01/2010 12:00 And we have working hours 09:00 to 17:00 in weekda

14条回答
  •  青春惊慌失措
    2020-11-27 05:30

    The first step would be to calculate working days, as shown in the script below:

    DECLARE @TotalWorkDays INT, @TotalTimeDiff DECIMAL(18, 2), @DateFrom DATETIME, @DateTo DATETIME;
    SET @DateFrom = '2017-06-05 11:19:11.287';
    SET @DateTo = '2017-06-07 09:53:14.750';
    
    SET @TotalWorkDays = DATEDIFF(DAY, @DateFrom, @DateTo)
        -(DATEDIFF(WEEK, @DateFrom, @DateTo) * 2)
       -CASE
                                        WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday'
                                        THEN 1
                                        ELSE 0
                                    END+CASE
                                            WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday'
                                            THEN 1
                                            ELSE 0
                                        END;
    

    The second step involves getting a difference in seconds between the two dates and converting that difference into hours by dividing by 3600.0 as shown in this following script:

    SET @TotalTimeDiff =
    (
        SELECT DATEDIFF(SECOND,
                       (
                           SELECT CONVERT(TIME, @DateFrom)
                       ),
                       (
                           SELECT CONVERT(TIME, @DateTo)
                       )) / 3600.0
    );
    

    The last part involves multiplying the output the first step above by 24 (total number of hours in a day) and then later adding that to the output of the second step:

    SELECT(@TotalWorkDays * 24.00) + @TotalTimeDiff;
    

    Finally, the complete script that can be used to create a user defined function for calculating working hours is shown below:

    CREATE FUNCTION [dbo].[fn_GetTotalWorkingHours]
    (
        @DateFrom Datetime,
        @DateTo Datetime
    )
    RETURNS DECIMAL(18,2)
    AS
    BEGIN
    
    DECLARE @TotalWorkDays INT, @TotalTimeDiff DECIMAL(18, 2)
    
    SET @TotalWorkDays = DATEDIFF(DAY, @DateFrom, @DateTo)
        -(DATEDIFF(WEEK, @DateFrom, @DateTo) * 2)
       -CASE
                                        WHEN DATENAME(WEEKDAY, @DateFrom) = 'Sunday'
                                        THEN 1
                                        ELSE 0
                                    END+CASE
                                            WHEN DATENAME(WEEKDAY, @DateTo) = 'Saturday'
                                            THEN 1
                                            ELSE 0
                                        END;
    SET @TotalTimeDiff =
    (
        SELECT DATEDIFF(SECOND,
                       (
                           SELECT CONVERT(TIME, @DateFrom)
                       ),
                       (
                           SELECT CONVERT(TIME, @DateTo)
                       )) / 3600.0
    );
    
    RETURN  (SELECT(@TotalWorkDays * 24.00) + @TotalTimeDiff)
    
    END
    GO
    

    The complete method is descibed in this article: https://www.sqlshack.com/how-to-calculate-work-days-and-hours-in-sql-server/     

提交回复
热议问题