计算日期类型

CREATE FUNCTION Fun_GetJiaBanTypeTatalHour(
@startdate NVARCHAR(50)--开始日期
,@starthour INT --开始小时
,@startmin INT --开始分钟
,@enddate NVARCHAR(50)--结束日期
,@endhour INT --结束小时
,@endmin INT --结束分钟
)
RETURNS @table TABLE(
jiabantype_day NVARCHAR(30),totalhour_day FLOAT,
jiabantype_week NVARCHAR(30),totalhour_week FLOAT,
jiabantype_holiday NVARCHAR(30),totalhour_holiday FLOAT
)
AS
BEGIN

DECLARE @isWeekResult INT ,
@jiabantype_day NVARCHAR(20)='', @jiabantype_week NVARCHAR(20)='', @jiabantype_holiday NVARCHAR(20)='',
@totalhour_day FLOAT=0 ,@totalhour_week FLOAT=0 ,@totalhour_holiday FLOAT=0,
@startdate_comebine NVARCHAR(50),@enddate_comebine NVARCHAR(50),@enddate_zero NVARCHAR(50)
,@start_zero_Hour FLOAT =0 ,@zero_end_Hour FLOAT =0 ,@start_end_Hour FLOAT =0

SET @startdate_comebine=@startdate+' '+CAST(@starthour AS NVARCHAR(10))+':'+CAST(@startmin AS NVARCHAR(10))
SET @enddate_zero=@enddate+' '+'00:00:00'
SET @enddate_comebine=@enddate+' '+CAST(@endhour AS NVARCHAR(10))+':'+CAST(@endmin AS NVARCHAR(10))

SELECT @start_end_Hour=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
SELECT @start_zero_Hour=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero))*1.0/60 AS NUMERIC(18,2))
SELECT @zero_end_Hour=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))

IF @startdate<>@enddate
BEGIN
--1 首先判断开始日期 是否是法定假日
IF EXISTS(SELECT TOP 1 1 FROM dbo.tb_LegalHoliday WHERE holidaydate=@startdate) --开始日期是法定假日
BEGIN
SET @jiabantype_holiday='法定假日'
--继续判断结束日期是否是法定假日
IF NOT EXISTS(SELECT TOP 1 1 FROM dbo.tb_LegalHoliday WHERE holidaydate=@enddate)--结束日期不是法定假日
BEGIN
--继续判断结束日期是否是双休日 DATEPART(dw,'date') in 7,、1
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult IN (7,1)--是双休日
BEGIN
SET @jiabantype_week='双休日'
--然后开始计算开始日期的加班时间 结束日期的加班时间
SET @totalhour_holiday=@start_zero_Hour
SET @totalhour_week=@zero_end_Hour
SET @totalhour_day=0
END
--否则的话是工作日
ELSE
BEGIN
SET @jiabantype_day='工作日'
SET @totalhour_week=0
SET @totalhour_holiday=@start_zero_Hour
SET @totalhour_day=@zero_end_Hour
END
END
ELSE
--结束日期和开始日期相同类型 都是法定假日
BEGIN
SET @totalhour_day=0
SET @totalhour_week=0 SET @totalhour_holiday=@start_end_Hour
END
END
ELSE
--开始日期不是法定假日 那么开始日期只有两种情况 双休日或者工作日
BEGIN
--如果开始日期不是法定假日 则判断是否是双休日
SELECT @isWeekResult=DATEPART(dw,@startdate)
IF @isWeekResult IN (7,1)--开始日期是双休日
BEGIN
SET @jiabantype_week='双休日'
--继续判断结束日期是否是双休日
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult NOT IN (7,1) --结束日期不是双休日
BEGIN
--先判断结束日期是否是法定假日
IF EXISTS(SELECT TOP 1 1 FROM dbo.tb_LegalHoliday WHERE holidaydate=@enddate)
BEGIN
SET @jiabantype_holiday='法定假日'
SET @totalhour_day=0
SET @totalhour_week=@start_zero_Hour
SET @totalhour_holiday=@zero_end_Hour
END
ELSE
--结束日期不是法定假日 则结束日期是工作日
BEGIN
SET @jiabantype_day='工作日'
SET @totalhour_holiday=0
SET @totalhour_week=@start_zero_Hour
SET @totalhour_day=@zero_end_Hour
END
END
ELSE
--结束日期和开始日期类型相同都是双休日
BEGIN
SET @totalhour_day=0
SET @totalhour_holiday=0
SET @totalhour_week=@start_end_Hour
END
END
ELSE
-- 开始日期是工作日
BEGIN
--如果开始日期不是法定假日 不是双休日,那么开始日期为工作日
--继续判断结束日期 是否为法定假日
SET @jiabantype_day='工作日'
IF EXISTS(SELECT TOP 1 1 FROM dbo.tb_LegalHoliday WHERE holidaydate=@enddate)
--结束日期是法定假日
BEGIN
SET @jiabantype_holiday='法定假日'
SET @totalhour_week=0
SET @totalhour_day=@start_zero_Hour
SET @jiabantype_holiday=@zero_end_Hour
END
ELSE
--结束日期为双休日或者工作日
BEGIN
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult IN (7,1)
--结束日期是双休日
BEGIN
SET @jiabantype_week='双休日'
SET @totalhour_day=@start_zero_Hour
SET @totalhour_week=@zero_end_Hour
SET @totalhour_holiday=0
END
ELSE
--结束日期是工作日
BEGIN
SET @totalhour_day=@start_end_Hour
SET @totalhour_holiday=0
SET @totalhour_week=0
END
END
END
END
END
ELSE
--同一天的加班时间
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM dbo.tb_LegalHoliday WHERE holidaydate=@startdate)--开始日期和加班日期都是法定假日
BEGIN
SET @jiabantype_holiday='法定假日'
SET @totalhour_holiday=@start_end_Hour
SET @totalhour_day=0
SET @totalhour_week=0
END
ELSE
BEGIN
--开始日期和结束日期均是双休日
SELECT @isWeekResult=DATEPART(dw,@startdate)
IF @isWeekResult IN (7,1)
BEGIN
SET @jiabantype_week='双休日'
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
SET @totalhour_day=0 SET @totalhour_holiday=0
END
ELSE
BEGIN
--开始日期结束日期均是工作日
SET @jiabantype_day='工作日'
SET @totalhour_holiday=0
SET @totalhour_week=0
SET @totalhour_day=@start_end_Hour
END
END
END

INSERT INTO @table
( jiabantype_day ,totalhour_day ,
jiabantype_week ,totalhour_week ,
jiabantype_holiday ,
totalhour_holiday
)
VALUES ( @jiabantype_day , -- jiabantype - nvarchar(30)
@totalhour_day , -- totalhour - float
@jiabantype_week , -- jiabantype_week - nvarchar(30)
@totalhour_week , -- totalhour_week - float
@jiabantype_holiday , -- jiabantype_holiday - nvarchar(30)
@totalhour_holiday -- totalhour_holiday - float
)
RETURN
END

原文地址:https://www.cnblogs.com/yachao1120/p/8526029.html