計算員工有效工作時間(sql版)


場景描述:公司員工每天9:00-17:00,每周1-5是有效工作時間,給你兩個時間段,要計算出有效的工作時間

比如說2013/2/4 12:21 -- 2013/2/9 14:33
求這段時間內員工的有效工作時間 
USE [SHLG_OA]
GO
/****** Object:  UserDefinedFunction [dbo].[fn_GetEffectiveWorkingTime]    Script Date: 02/26/2013 17:05:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/**************************************************
*自定義函數名 : --[fn_GetEffectiveWorkingTime]
*函數功能 : --獲取有效工作時間(周一到周五,9:00-17:00)
*輸入參數 : 
*輸出參數 : 分鍾
*作者 : --劉仁和
*創建時間 : --2012.11.7
*更新時間 : 
**************************************************/
ALTER FUNCTION [dbo].[fn_GetEffectiveWorkingTime](@starttime DATETIME,
                                                  @endtime   DATETIME)
returns INT
AS
  BEGIN
      DECLARE @t_starttime DATETIME=NULL --調整開始時間為規格時間,日期置為周一,時間置為上午9:00或下午5點
      DECLARE @t_endtime DATETIME=NULL --調整結束時間為規格時間,日期置為周一,時間置為上午9:00或下午5點
      DECLARE @day_dvalue INT=0 --天數部分差值
      DECLARE @minute_dvalue INT=0 --時間部分差值
      DECLARE @retrun_dvalue INT=0 --返回總差值

      IF( @starttime IS NULL
           OR @endtime IS NULL )
        RETURN 0
      ELSE
        BEGIN
            --Datepart(weekday, @starttime + @@DateFirst - 1)獲取星期
            --若開始時間在周末,日期置於周五,時間置於下午5點
            IF(Datepart(weekday, @starttime + @@DateFirst - 1)=6 OR Datepart(weekday, @starttime + @@DateFirst - 1)=7)
              BEGIN
                  SET @starttime=Dateadd(day, -( Datepart(weekday,
                                                  @starttime + @@DateFirst
                                                  - 1) - 5 ),
                                                  @starttime)
                  SET @starttime=Cast(CONVERT(NVARCHAR(10), @starttime, 120)
                                        + ' 17:00:00.00' AS DATETIME)                                  
              END
            --若結束時間在周末,日期置於周五,時間置於下午5點
            IF(Datepart(weekday, @endtime + @@DateFirst - 1)=6 OR Datepart(weekday, @endtime + @@DateFirst - 1)=7)
              BEGIN
                  SET @endtime=Dateadd(day, -( Datepart(weekday,
                                                  @endtime + @@DateFirst
                                                  - 1) - 5 ),
                                                  @endtime)
                  SET @endtime=Cast(CONVERT(NVARCHAR(10), @endtime, 120)
                                        + ' 17:00:00.00' AS DATETIME)                                  
              END
            --開始日期置於周一
            --注意:@t_starttime和@starttime是兩個變量
            SET @t_starttime=Dateadd(day, -( Datepart(weekday,
                                             @starttime + @@DateFirst
                                             - 1) - 1 ),
                                              @starttime)
            --結束日期置於周一                                  
            SET @t_endtime=Dateadd(day, -( Datepart(weekday,
                                           @endtime + @@DateFirst
                                           - 1) - 1 ), @endtime)
            

            --Convert(NVARCHAR(10), @t_starttime, 120)獲取日期部分
            IF( Datepart(hh, @starttime) < 9 )
              BEGIN
                  --開始時間置於上午9點
                  SET @t_starttime=Cast(CONVERT(NVARCHAR(10), @t_starttime, 120)
                                        + ' 9:00:00.00' AS DATETIME)
              END
            ELSE IF( Datepart(hh, @t_starttime) > 16 )
              BEGIN
                  --開始時間置於下午5點
                  SET @t_starttime=Cast(CONVERT(NVARCHAR(10), @t_starttime, 120)
                                        + ' 17:00:00.00' AS DATETIME)
              END

            IF( Datepart(hh, @t_endtime) < 9 )
              BEGIN
                  --結束時間置於上午9點
                  SET @t_endtime=Cast(CONVERT(NVARCHAR(10), @t_endtime, 120)
                                      + ' 9:00:00.00' AS DATETIME)
              END
            ELSE IF( Datepart(hh, @t_endtime) > 16 )
              BEGIN
                  --結束時間置於下午4點
                  SET @t_endtime=Cast(CONVERT(NVARCHAR(10), @t_endtime, 120)
                                      + ' 17:00:00.00' AS DATETIME)
              END

            --計算天數部分差值
            SET @day_dvalue=Datediff(day, @t_starttime, @t_endtime) - 2 *
                            Datediff(day, @t_starttime, @t_endtime) / 7
            SET @day_dvalue=@day_dvalue
                            + Datediff(day, @t_endtime, @endtime)
                            - Datediff(day, @t_starttime, @starttime)
                            
                            
            --計算時間部分的差值(分鍾)
            SET @minute_dvalue=( Datepart(hh, @t_endtime) -
                                 Datepart(hh, @t_starttime)
                               )
                               * 60 + (
                               Datepart(mi, @t_endtime) -
                               Datepart(mi, @t_starttime) )
            --計算總時間差(分鍾)
            SET @retrun_dvalue=@day_dvalue * 8 * 60 + @minute_dvalue
        END

      RETURN @retrun_dvalue

 

 

select dbo.fn_GetEffectiveWorkingTime('2013/2/4 12:21','2013/2/9 14:33')

 

 
 結果:2199


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM