1. 程式人生 > >計算日期類型-未完待完成

計算日期類型-未完待完成

小時 top _id div num lec objects 兩種 cts

/* =======================================
版權:CuiYaChao
創 建 人:CuiYaChao
創建日期:
功能描述:傳遞6個參數 開始日期 開始小時 開始分鐘 結束日期 結束小時 結束分鐘,
計算得出該段時間的加班類型以及對應加班類型的小時數加班類型有 工作日 雙休日 法定假日
******有可能某一天既是法定假日 又是雙休日******
單元名稱: Fun_GetJiaBanTypeTatalHour
主表(可更新表):
包含表:
修改日誌:
其它說明:

======================================= */
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N‘[dbo].[Fun_GetJiaBanTypeTatalHour]‘))
DROP FUNCTION Fun_GetJiaBanTypeTatalHour
GO

CREATE FUNCTION Fun_GetJiaBanTypeTatalHour(
@startdate NVARCHAR(50)--開始日期
,@starthour INT --開始小時
,@startmin INT --開始分鐘
,@enddate NVARCHAR(50)--結束日期
,@endhour INT --結束小時
,@endmin INT --結束分鐘
)
RETURNS NVARCHAR(50)
AS
BEGIN
DECLARE @sresult NVARCHAR(50) ,@isWeekResult INT ,
@jiabantype NVARCHAR(20), @jiabantype_week NVARCHAR(20), @jiabantype_holiday NVARCHAR(20),
@totalhour FLOAT ,@totalhour_week FLOAT ,@totalhour_holiday FLOAT,
@startdate_comebine NVARCHAR(50),@enddate_comebine NVARCHAR(50),@enddate_zero NVARCHAR(50)

SET @startdate_comebine=@startdate+‘ ‘+@starthour+‘:‘+@startmin
SET @enddate_zero=@enddate+‘ ‘+‘00:00:00‘
SET @enddate_comebine=@enddate+‘ ‘+@endhour+‘:‘+@endmin

IF @startdate<>@enddate
BEGIN
--1 首先判斷開始日期 是否是法定假日
IF EXISTS(SELECT TOP 1 1 FROM dbo.fm_holiday WHERE holidaydate=@startdate) --開始日期是法定假日
BEGIN
--繼續判斷結束日期是否是法定假日
IF NOT EXISTS(SELECT TOP 1 1 FROM dbo.fm_holiday 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 @jiabantype_holiday=‘法定假日‘
--然後開始計算開始日期的加班時間 結束日期的加班時間
SELECT @totalhour_holiday=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero)*1.0/60) AS NUMERIC(18,2))
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine)*1.0/60) AS NUMERIC(18,2))
SET @totalhour=0
END
--否則的話是工作日
ELSE
BEGIN
SET @jiabantype=‘工作日‘
SET @jiabantype_holiday=‘法定假日‘
--然後開始計算開始日期的加班時間 結束日期的加班時間
SELECT @totalhour_holiday=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero)*1.0/60) AS NUMERIC(18,2))
SELECT @totalhour=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine)*1.0/60) AS NUMERIC(18,2))
SET @totalhour_week=0
END
END
ELSE
--結束日期和開始日期相同類型 都是法定假日
BEGIN
SET @jiabantype_holiday=‘法定假日‘
SET @totalhour=0
SET @totalhour_week=0
SELECT @totalhour_holiday=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_comebine)*1.0/60) AS NUMERIC(18,2))
END
END
ELSE
--開始日期不是法定假日 那麽開始日期只有兩種情況 雙休日或者工作日
BEGIN
--如果開始日期不是法定假日 則判斷是否是雙休日
SELECT @isWeekResult=DATEPART(dw,@startdate)
IF @isWeekResult IN (7,1)--開始日期是雙休日
BEGIN
--繼續判斷結束日期是否是雙休日
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult NOT IN (7,1) --結束日期不是雙休日
BEGIN
--先判斷結束日期是否是法定假日
IF EXISTS(SELECT TOP 1 1 FROM dbo.fm_holiday WHERE holidaydate=@enddate)
BEGIN
SET @jiabantype_holiday=‘法定假日‘
SET @jiabantype_week=‘雙休日‘
--然後開始計算開始日期的加班時間 結束日期的加班時間
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero)*1.0/60) AS NUMERIC(18,2))
SELECT @totalhour_holiday=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine)*1.0/60) AS NUMERIC(18,2))
SET @totalhour=0
END
ELSE
--結束日期不是法定假日 則結束日期是工作日
BEGIN
SET @jiabantype_week=‘雙休日‘
SET @jiabantype=‘工作日‘
SELECT @totalhour_holiday=0
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero))*1.0/60 AS NUMERIC(18,2))
SELECT @totalhour=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
END
END
ELSE
--結束日期和開始日期類型相同都是雙休日
BEGIN
SET @jiabantype_week=‘雙休日‘
SET @totalhour=0
SET @totalhour_holiday=0
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_comebine)*1.0/60) AS NUMERIC(18,2))
END
END
ELSE
--開始日期不是法定假日 不是雙休日 則開始日期確定是工作日
BEGIN
--如果開始日期不是法定假日 不是雙休日,那麽開始日期為工作日
--繼續判斷結束日期 是否為工作日
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult NOT IN (1,2,3,4,5)
BEGIN
--結束日期不是工作日 ,那麽判斷結束日期是否為法定假日或者雙休日
IF EXISTS(SELECT TOP 1 1 FROM dbo.fm_holiday WHERE holidaydate=@enddate)--如果結束日期是法定假日
BEGIN
SET @jiabantype_holiday=‘法定假日‘
SET @jiabantype=‘工作日‘
SET @totalhour_week=0
SELECT @totalhour=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero))*1.0/60 AS NUMERIC(18,2))
SELECT @totalhour_holiday=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
END
ELSE
--結束日期不是法定假日 則繼續判斷結束日期是否為雙休日
BEGIN
SELECT @isWeekResult=DATEPART(dw,@enddate)
IF @isWeekResult IN (7,1)--結束日期是雙休日
BEGIN
SET @jiabantype_week=‘雙休日‘
SET @jiabantype=‘工作日‘
SET @totalhour_holiday=0
SELECT @totalhour=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_zero))*1.0/60 AS NUMERIC(18,2))
SELECT @totalhour_week=CAST((SELECT DATEDIFF(MINUTE,@enddate_zero,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
END
END
END
ELSE
--結束日期是工作日
BEGIN
SET @jiabantype=‘工作日‘
SET @totalhour_holiday=0 SET @totalhour_week=0
SELECT @totalhour=CAST((SELECT DATEDIFF(MINUTE,@startdate_comebine,@enddate_comebine))*1.0/60 AS NUMERIC(18,2))
END
END
END
END

RETURN @sresult
END

計算日期類型-未完待完成