1、查询指定时间区间的工作日
这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表。主要字段有年份,类型(是否调休),假期日期。如下:
1 2 3 4 5 6 7 8 | CREATE TABLE [dbo].[Holidays]( [ID] [ int ] IDENTITY(1,1) NOT NULL , [Holiday] [datetime2](7) NULL , --假期日期 [YearS] [ char ](4) NULL , --年份 [daytype] [ int ] NULL --类型 ) |
添加好当年的假期和调休日期
写个方法计算出除开法定假日的工作日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | ALTER FUNCTION [dbo].[GetWorkerDays] ( -- Add the parameters for the function here @StartTime DATETIME, -- 起始时间 @EndTime DATETIME -- 结束时间,查询默认小于此时间 ) RETURNS INT AS BEGIN DECLARE @Total INT ; DECLARE @ Temp INT ; DECLARE @Days INT ; DECLARE @ Index INT ; SET @Days = DATEDIFF( DAY ,@StartTime,@EndTime); SET @ Index = 0; SET @ Temp = 0; SET @Total = 0; WHILE @ Index < @Days BEGIN SET @ Temp = DatePart(WEEKDAY,DATEADD( DAY ,@ Index ,@StartTime)); IF @ Temp > 1 AND @ Temp < 7 BEGIN SET @Total = @Total + 1; END SET @ Index = @ Index + 1; END RETURN ISNULL (@Total,0) END |
执行这个表值函数后加上调休日和减去法定假日就是工作日了,大家可以再写一个存储过程。
2,计算指定日期段的休息日
这个跟那个相反,就是星期天加上法定假日在减去调休日
我们写一个函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ALTER FUNCTION GetRestDays ( @StartTime DATETIME2, @EndTime DATETIME2 ) RETURNS INT AS BEGIN DECLARE @LegalRest INT --法定假期 DECLARE @AdjustmentDay INT --调休上班时间 DECLARE @SurplusDay INT --剩余工作日 DECLARE @CountDay INT --总共天数 SELECT @LegalRest= COUNT (0) FROM dbo.Holidays WHERE daytype=1 AND YearS= YEAR (GETDATE()) AND MONTH (Holiday)= MONTH (GETDATE()) AND Holiday>=@StartTime AND Holiday<=@EndTime SELECT @AdjustmentDay= COUNT (0) FROM dbo.Holidays WHERE daytype=2 AND YearS= YEAR (GETDATE()) AND MONTH (Holiday)= MONTH (GETDATE()) AND Holiday>=@StartTime AND Holiday<=@EndTime SET @SurplusDay= [dbo].[GetWorkerDays](@StartTime,DATEADD( DAY ,1,@EndTime)) --剩余工作日 SELECT @CountDay= COUNT (0) FROM dbo.TimeSpanDays(@StartTime ,DATEADD( DAY ,1,@EndTime)) --总共天数 计算出 时间段总共天数 return @CountDay-@SurplusDay+@LegalRest-@AdjustmentDay END |
3、计算当前前月初日期和月末日期
月初
简单:
1 | SELECT CONVERT ( VARCHAR (7),GETDATE(),120)+ '-01' |
月末日期
这个也简单简单:就是月第一天加一月再减去一天
1 | SELECT DATEADD( DAY ,-1, DATEADD( MONTH ,1, CONVERT ( VARCHAR (7),GETDATE(),120)+ '-01' )) |