计算日期类型
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
            
 
作者:RichardCui            
 
出处:https://www.cnblogs.com/yachao1120/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-RichardCuiBlog。    
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号