労働時間の時間のSQLクエリ数(控除週末に向けて6,9泊)

- 1、新しい機能(土日を除きます)

。FUNCTION [DBO] [getCnt](CREATE
@begintime DATETIME、
@endtime DATETIMEは

@tabテーブルを返し(CNTはint)
AS
BEGIN
DECLAREの@cnt INTの
SETする@ CNT = 0を
新增判断是否开始结束日期为空的-
IF (ISNULL(@begintime、 '')= '' OR ISNULL(@endtime、 '')=は、 '')
BEGIN
INSERT INTOが@tab
@cnt SELECT
END
ELSE
@ BEGINTIME = DATEADD(DAY、1、@のBEGINTIME)SET
キャストWHILEを(DATE AS @begintime)<キャスト(DATE AS @endtime)
BEGIN
(DATEPART(平日、@のBEGINTIME)= 7 OR DATEPART(平日、@のBEGINTIMEが)= 1)IF
BEGIN
のSET @ CNTをCNT @ =
END
ELSE
BEGIN
SET @cntを= @ CNT + 1つの
END
SET @ BEGINTIME = DATEADD(DAY、1、@のBEGINTIME)
END
INSERT INTOは@tab
@cnt SELECT
RETURNの
ENDを

--2、新機能(計算時間午前6時00分に向けて9)

。CREATE FUNCTIONを[DBO] [次に、getHours]
(@begintime DATETIME、
@endtime DATETIME

RETURNSが整数
WITH EXECをCALLER AS
AS
BEGIN
DECLAREの@cntはint = 0 -結果保存
INSERT INTO @tab -
SELECT CNT = @(CASEを
-場合は、同じ日、同じ日に新しい開始日と終了日かどうかを判断する直接DATEDIFF(終了時刻@ BEGINTIME @時間、、)
CAST(日として@begintime)=キャスト(日として@endtime)BEGINTIME @その後、DATEDIFF(時間、 @endtime)
-時間間隔が0である場合、空白があるかどうか、新しい開始日と終了日を決定
WHEN ISNULL(@begintime、「」)=「」OR ISNULL(@endtime、「」)=「」を0
ELSE
CASE
THEN DATEPART(WEEKDAY、@begintime)IN(7 ,. 1)0
ELSE
CASE
-開始時間を決定します
場合DATENAME(時間、@begintime)> = 9およびDATENAME(時間、@begintime)<= 18 THEN 18 -DATENAME(時間、@begintime)
WHEN DATENAME(時間、@begintime)<9 THEN 9
DATENAME(時間、@ BEGINTIME)> 18 THEN 0
ENDの
END
+
CASE
WHEN DATEPART IN(平日、@endtime)(7,1)THEN 0
ELSEの
CASE
-判断结束时间
DATENAME(時間、@endtime)> = 9およびDATENAME(時間、@ ENDTIME)<= 18 THEN DATENAME(時間、@endtime)-9
DATENAME(時間、@endtime)<9 THEN 0
WHEN DATENAME(時間、@endtime)> 18 THEN 9
のEND
ENDの
END
+ b.cnt * 9)
FROM dbo.getCnt(@ BEGINTIME、終了時刻@)のB

RETURNの@cntの

END

--- 3、関数を呼び出します

SELECT dbo.gethours( '2019年7月19日09:00'、GETDATE())

おすすめ

転載: www.cnblogs.com/Bill-Lee/p/11238015.html