Calculate business hours between two dates

前端 未结 14 1303
被撕碎了的回忆
被撕碎了的回忆 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:37

    ALTER FUNCTION WorkTime_fn (@StartDate DATETIME, @FinishDate DATETIME)
    RETURNS VARCHAR(9)
    AS
    BEGIN
        DECLARE @Temp BIGINT
        SET @Temp=0
    
        DECLARE @FirstDay VARCHAR(9)
        SET @FirstDay = CONVERT(VARCHAR(9),@StartDate, 112)
    
        DECLARE @LastDay VARCHAR(9)
        SET @LastDay = CONVERT(VARCHAR(9),@FinishDate, 112)
    
        DECLARE @StartTime VARCHAR(9)
        SET @StartTime = CONVERT(VARCHAR(9),@StartDate, 108)
    
        DECLARE @FinishTime VARCHAR(9)
        SET @FinishTime = CONVERT(VARCHAR(9),@FinishDate, 108)
    
        DECLARE @WorkStart VARCHAR(9)
        SET @WorkStart = '09:30:00'
    
        DECLARE @WorkFinish VARCHAR(9)
        SET @WorkFinish = '17:30:00'
    
        IF (@StartTime<@WorkStart)
        BEGIN
            SET @StartTime = @WorkStart
        END
        IF (@FinishTime>@WorkFinish)
        BEGIN
            SET @FinishTime=@WorkFinish
        END
    
    DECLARE @CurrentDate VARCHAR(9)
        SET @CurrentDate = CONVERT(VARCHAR(9),@StartDate, 112)
        DECLARE @LastDate VARCHAR(9)
        SET @LastDate = CONVERT(VARCHAR(9),@FinishDate, 112)
    
    WHILE(@CurrentDate<=@LastDate)
    BEGIN       
    
            IF (DATEPART(dw, @CurrentDate)!=1 AND DATEPART(dw, @CurrentDate)!=7)
            BEGIN
                  IF (@CurrentDate!=@FirstDay) AND (@CurrentDate!=@LastDay)
                  BEGIN
                       SET @Temp = (@Temp + (8*60))
    
                  END
    
                  ELSE IF (@CurrentDate=@FirstDay) AND (@CurrentDate!=@LastDay)
                  BEGIN
                    SET @Temp = @Temp + DATEDIFF(MINUTE, @StartTime, @WorkFinish)
    
                  END
    
                  ELSE IF (@CurrentDate!=@FirstDay) AND (@CurrentDate=@LastDay)
                  BEGIN
                    SET @Temp = @Temp + DATEDIFF(MINUTE, @WorkStart, @FinishTime)
    
                  END
    
                  ELSE IF (@CurrentDate=@FirstDay) AND (@CurrentDate=@LastDay)
                  BEGIN
                    SET @Temp = DATEDIFF(MINUTE, @StartTime, @FinishTime)
    
                  END
    
                 END
    
    SET @CurrentDate = CONVERT(VARCHAR(9),DATEADD(day, 1, @CurrentDate),112)
    
    END
            Return @TEMP
    
    END
    

提交回复
热议问题