SQL查询上班时间小时数(朝9晚6且扣除周未)

--1、新建函数(排除周未)

CREATE FUNCTION [dbo].[getCnt](
@begintime DATETIME,
@endtime DATETIME
)
RETURNS @tab TABLE(cnt int)
AS
BEGIN
DECLARE @cnt INT
SET @cnt=0
--新增判断是否开始结束日期为空的
IF (isnull(@begintime,'')='' OR ISNULL(@endtime,'')='')
BEGIN
INSERT INTO @tab
SELECT @cnt
END
ELSE
SET @begintime=DATEADD(DAY,1,@begintime)
WHILE cast(@begintime AS DATE)<cast(@endtime AS DATE)
BEGIN
IF(DATEPART(weekday,@begintime)=7 OR DATEPART(weekday,@begintime)=1)
BEGIN
SET @cnt=@cnt
END
ELSE
BEGIN
SET @cnt=@cnt+1
END
SET @begintime=DATEADD(DAY,1,@begintime)
END
INSERT INTO @tab
SELECT @cnt
RETURN
END

--2、新建函数(计算朝9晚6时间)

CREATE FUNCTION [dbo].[gethours]
(@begintime DATETIME,
@endtime DATETIME
)
RETURNS INTEGER
WITH EXEC AS CALLER
AS
BEGIN
DECLARE @cnt int=0 --保存结果
-- insert into @tab
SELECT @cnt=( CASE
--新增一个判断开始结束日期是否同一天,如果同一天就直接DATEDIFF(hour,@begintime,@endtime)
WHEN CAST(@begintime AS date)=cast(@endtime AS DATE) THEN DATEDIFF(hour,@begintime,@endtime)
--新增一个判断开始结束日期是否有一个为空,如果是则间隔时间为0
WHEN ISNULL(@begintime,'')='' OR ISNULL(@endtime,'')='' THEN 0
ELSE
CASE
WHEN DATEPART(weekday, @begintime) IN (7, 1) THEN 0
ELSE
CASE
--判断开始时间
when DATENAME(hour, @begintime)>=9 AND DATENAME(hour, @begintime)<=18 THEN 18 -DATENAME(hour, @begintime)
WHEN DATENAME(hour, @begintime)<9 THEN 9
WHEN DATENAME(hour, @begintime)>18 THEN 0
END
END
+
CASE
WHEN DATEPART(weekday, @endtime) IN (7, 1) THEN 0
ELSE
CASE
--判断结束时间
when DATENAME(hour, @endtime)>=9 AND DATENAME(hour, @endtime)<=18 THEN DATENAME(hour, @endtime) -9
WHEN DATENAME(hour, @endtime)<9 THEN 0
WHEN DATENAME(hour, @endtime)>18 THEN 9
END
END
END
+ b.cnt*9 )
FROM dbo.getCnt(@begintime,@endtime) b

RETURN @cnt

END

--3、调用函数

SELECT dbo.gethours('2019-07-19 09:00',GETDATE())

猜你喜欢

转载自www.cnblogs.com/Bill-Lee/p/11238015.html