程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL語句計算兩個日期之間有多少個工作日的方法

SQL語句計算兩個日期之間有多少個工作日的方法

編輯:關於SqlServer

/*
因為工作中一個奇怪的需求,要用SQL語言計算兩個日期間有多少個工作日。
設定是一個星期有5個工作日,從星期一到星期五
說明:
  第一個星期的工作日數:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
  末一個星期的工作日數:DATEPART(dw, @enddt),最多5天
計算方法:
  如果兩個日期處在同一個星期內,直接計算“第一個星期的工作日數”
  否則按下面的公式計算
    (兩個日期間的總天數 - 第一個星期的天數 - 末一個星期的天數) / 7 * 5
  + 第一個星期的工作日數
  + 末一個星期的工作日數
*/

 --計算並返回兩個日期間的工作小時數(工作日*8)按周一到周五計算
--必須先SET DATEFIRST 1
CREATE FUNCTION dbo.CalcWorkHours(@bdate DATETIME, @edate DATETIME)
 RETURNS INTEGER
AS BEGIN
 DECLARE @hours INTEGER
 IF @@DATEFIRST <> 1 OR @bdate > @edate
  RETURN -1
 SELECT @hours =
     --如果終止日期與起始日期在同一個星期內,只需要計算有幾天即可
     CASE WHEN DATEPART(wk, @edate-1)-DATEPART(wk,@bdate) = 0 THEN
          CASE WHEN DATEPART(dw, @bdate) > 5 THEN 0
            WHEN DATEPART(dw, @edate-1) > 5 THEN 6 - DATEPART(dw, @bdate)
            ELSE DATEPART(dw, @edate-1) - DATEPART(dw, @bdate) + 1 END
       --如果終止日期與起始日期在不同的星期內
       --首先計算出除前後兩個星期外完整的星期數 * 5
       ELSE (DATEDIFF(dd,@bdate,@edate)
             - (8-DATEPART(dw, @bdate))
             - DATEPART(dw, @edate-1)) / 7 * 5
          --再加上第一個星期裡的工作日數
         + CASE WHEN DATEPART(dw, @bdate) < 6 THEN 6 - DATEPART(dw, @bdate)
            ELSE 0 END
          --加上末一個星期裡的工作日數
         + CASE WHEN DATEPART(dw, @edate-1)>5 THEN 5 ELSE DATEPART(dw, @edate-1) END
     END * 8
 RETURN @hours
END

以上就是本文的全部內容,希望對大家的學習有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved