場景描述:公司員工每天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