写个方法计算出除开法定假日的工作日,” 代表在指定的秒数触发

下文讲述常规的指定工作日所在月的天数分析,涉及星期六星期天调班,不算工作日)dt1和dt2之间相隔多少工作日,其中dt3-dt4的时间为公休日,添加好当年的假期和调休日期,执行这个表值函数后加上调休日和减去法定假日就是工作日了,添加好当年的假期和调休日期,执行这个表值函数后加上调休日和减去法定假日就是工作日了,” 代表在指定的秒数触发,45″代表0秒、15秒和45秒时触发任务

图片 3

}

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

  

  1. cron表达式格式:

图片 1

System.TimeSpan
tsDiffer=dt2.Date-dt1.Date;//计算dt2和dt1之间相差多少天
int intDiffer=tsDiffer.Days;//相差天数的int值
for(int
i=0;i<intDiffer;i++)//从dt1开始一天天加,判断临时的日期值是不是星期六或星期天,如果既不是星期六,也不是星期天,而且也不在dt3和dt4之间,则该天为工作日,intReturn加1
{
    DateTime dtTemp=dt1.Date.AddDays(i);
    if((dtTemp.DayOfWeek!=System.DayOfWeek.Sunday) &&
(dtTemp.DayOfWeek!=System.DayOfWeek.Saturday))
    {
        if((dtTemp.Date<dt3.Date) || (dtTemp.Date>dt4.Date))
        {
            intReturn++;
        }
    }
   
}
return intReturn;

 

这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表。主要字段有年份,类型(是否调休),假期日期。如下:

3.
cron表达式的强大魅力在于灵活的横向和纵向组合以及简单的语法,用cron表达式几乎可以写出任何你想要触发的时间点

下文讲述常规的指定工作日所在月的天数分析,
实现思路:
1 生成一个国家法定假日表(A),非星期六,星期天
2 生成一个国家法定补办表(B),涉及星期六星期天调班
3 生成指定月份的日期流水表(C)
4 获取指定日期的工作日信息,如下所示:

/**//**//**//// <summary>
///
计算两个日期之间的工作日数,(星期6,星期天,不算工作日)dt1和dt2之间相隔多少工作日,其中dt3-dt4的时间为公休日,这里公休日可以用以个数组,或者从一个xml表里面读取,以便扣除
/// </summary>
/// <param name=”dt1″>要计算的起始时间</param>
/// <param name=”dt2″>要计算的结束时间</param>
/// <param name=”dt3″>公休起始时间</param>
/// <param name=”dt4″>公休结束时间</param>
/// <returns>intReturn</returns>
private int DifferDate(DateTime dt1,DateTime dt2,DateTime dt3,DateTime
dt4)
{
int intReturn=0;//返回值,即dt2和dt1之间的工作日数

简单:

 

{分钟} ==> 允许值范围: 0~59
,不允许为空值,若值不合法,调度器将抛出SchedulerException异常

转自:http://www.maomao365.com/?p=6771

3、计算当前前月初日期和月末日期

月初

“30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务

摘要:

月初

这个跟那个相反,就是星期天加上法定假日在减去调休日

“0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务

下文讲述工作中,需要获取指定日期在当月的工作日

SELECT   DATEADD(DAY,-1, DATEADD(MONTH,1, CONVERT(VARCHAR(7),GETDATE(),120)+'-01'))

月末日期

“#”
用来指定具体的周数,”#”前面代表星期,”#”后面代表本月第几周,比如”2#2″表示本月第二周的星期一,”5#3″表示本月第三周的星期四,因此,”5L”这种形式只不过是”#”的特殊形式而已

--例: 获取 2018-4-10 为2018年4月的第几个工作日
declare @d datetime
set @d ='2018-4-10' --可通过下面的方法计算出 为本月第6个工作日

---1:获取4月指定日期的所在月工作日数
create table A(A datetime)
create table B(B datetime)
----4.5.4.6 4.7 4.30为法定假日
insert into A (A)values('2018-4-5'),
('2018-4-6'),('2018-4-7'),('2018-4-30')
----补班日 4月8 4月28 4月30 日
insert into B (B)values('2018-4-8'),
('2018-4-28'),('2018-4-30')

---生成指定月份(4月)所有天数流水
set datefirst 1 --设置星期一为第一个工作日

select * from 
(

select row_number() over(order by d asc ) as [本月第*个工作日],d,datepart(w,d) as [weekInfo] from (
select dateadd(day,number,'2018-4-1') as d from master..spt_values 
where type='p' 
and number >=0 
and dateadd(day,number,'2018-4-1') between '2018-4-1' and dateadd(day,-1,'2018-5-1')
) as a 
where a.d not in (select A from A)
and (a.d in (select b from B ) 
or datepart(w,a.d) not in (6,7) 
)
) as extend 
where d =@d 

go
drop table A 
drop table B
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~31
,不允许为空值,若值不合法,调度器将抛出SchedulerException异常

这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表。主要字段有年份,类型(是否调休),假期日期。如下:

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

“30 10 * * * ?” 每小时的10分30秒触发任务

  

2,计算指定日期段的休息日

“?”
与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起
冲突和混乱

1、查询指定时间区间的工作日

 CREATE TABLE [dbo].[Holidays](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Holiday] [datetime2](7) NULL,--假期日期

[YearS] [char](4) NULL,--年份
[daytype] [int] NULL--类型

)

“-”
代表在指定的月份范围内触发,比如”1-6″代表从1月份开始触发到6月份结束触发,每隔1个月触发

执行这个表值函数后加上调休日和减去法定假日就是工作日了,大家可以再写一个存储过程。

  

“,”代表在指定的年份才触发,比如”2011,2012,2013″代表2011年、2012年和2013年触发任务

  

SELECT  CONVERT(VARCHAR(7),GETDATE(),120)+'-01'

“/”
代表触发步进(step),”/”前面的值代表初始值(“*”等同”0”),后面的值代表偏移量,比如”0/25″或者”*/25″代表从0分钟开始,每隔25分钟触发1次,即0分钟触发1次,第25分钟触发1次,第50分钟触发1次;”5/25″代表5分钟触发1次,30分钟触发1次,55分钟触发1次;”10-45/20″代表在[10,45]内步进20分钟命中的时间点触发,即10分钟触发1次,30分钟触发1次

添加好当年的假期和调休日期

1、查询指定时间区间的工作日

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

这个跟那个相反,就是星期天加上法定假日在减去调休日

我们写一个函数

图片 3