澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

苏息日数等日子操作,总括五个日子之间的劳作

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

/**//**//**//// <summary>
/// 计算几个日子之间的办事日数,(星期陆,星期5,不算专门的工作日)dt1和dt二之间相隔多少专门的工作日,在这之中dt叁-dt四的光阴为公共休假期,这里公休日能够用于个数组,只怕从1个xml表里面读取,以便扣除
/// </summary>
/// <param name="dt1">要总括的起首时间</param>
/// <param name="dt贰">要计算的了断时间</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;//再次来到值,即dt贰和dt一之间的做事日数

一、查询钦定时期间隔的职业日

一、查询内定期间距离的职业日

一. cron表明式格式:

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

摘要:

System.TimeSpan tsDiffer=dt2.Date-dt一.Date;//总计dt二和dt1之间相差多少天
int intDiffer=tsDiffer.Days;//相差天数的int值
for(int i=0;i<intDiffer;i )//从dt壹初始1每一日加,判断一时半刻的日期值是还是不是星期贰或礼拜5,就算既不是周一,也不是周末,而且也不在dt三和dt四之间,则该天为专门的学问日,intReturn加一
{
    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;

其1第二难题是法定节日,国家的官方节日每年都不均等,还提到到调休,所以我们设计叁个假日表。首要字段有年度,类型(是不是调休),假日日期。如下:

其一首要难题是法定节日,国家的法定节日每年都不均等,还论及到调休,所以大家安插七个假期表。主要字段有年度,类型(是或不是调休),假期日期。如下:

2. cron表达式各占位符解释:

{秒数} ==> 允许值范围: 0~59,不允许为空值,若值非法,调节器将抛出SchedulerException非常

"*" 代表每隔1分钟触发;

"," 代表在内定的秒数触发,比方"0,一5,4五"代表0秒、1五秒和45秒时接触职分

"-" 代表在内定的限制内接触,比如"25-45"代表从25秒初阶触发到四5秒甘休触发,每隔一秒触发一回

"/" 代表触发步进(step),"/"后边的值代表伊始值("*"等同"0"),前边的值代表偏移量,举个例子"0/20"只怕"*/20"代表从0分钟伊始,每隔20分钟触发3回,即0秒触发二回,20秒触发3次,40秒触发三回;"5/20"代表5秒触发一回,25秒触发贰次,四5秒触发三回;"拾-45/20"代表在[10,45]内步进20秒命中的时间点触发,即10秒触发三次,30秒触发1回

{分钟} ==> 允许值范围: 0~5九,不容许为空值,若值违法,调解器将抛出SchedulerException非凡

"*" 代表每隔一分钟触发;

"," 代表在钦命的分钟触发,比方"拾,20,40"代表10秒钟、20分钟和40分钟时接触职分

"-" 代表在内定的范围内接触,举个例子"5-30"代表从5分钟早先触发到二十八分钟甘休触 发,每隔1秒钟触发

"/" 代表触发步进(step),"/"前边的值代表起先值("*"等同"0"),前面包车型地铁值代表偏移量,比方"0/二5"也许"*/2伍"代表从0秒钟开头,每隔贰陆分钟触发三遍,即0分钟触发贰回,第3四分钟触发3次,第伍拾柒分钟触发3回;"5/二5"代表四分钟触发3回,三二十分钟触发一次,五十二秒钟触发3次;"十-45/20"代表在[10,45]内步进20分钟命中的时间点触发,即10分钟触发3回,三十分钟触发贰遍

{小时} ==> 允许值范围: 0~23,不一致意为空值,若值违法,调节器将抛出SchedulerException相当

"*" 代表每隔一钟头触发;

"," 代表在钦赐的岁月点触发,举例"10,20,二三"代表十点钟、20点钟和2三点触发职分

"-" 代表在钦命的日子段内触发,举个例子"20-二三"代表从20点起来触发到二三点停止触发,每隔壹小时触发

"/" 代表触发步进(step),"/"前边的值代表伊始值("*"等同"0"),前边的值代表偏移量,比如"0/一"或许"*/1"代表从0点起来接触,每隔1钟头触发叁回;"3/陆"代表从一点启幕接触,今后每隔二钟头触发壹回;"1玖-20/贰"表明式将只在1玖点触发

{日期} ==> 允许值范围: 1~3一,不一样意为空值,若值不合规,调节器将抛出SchedulerException相当

"*" 代表每一日接触;

"?" 与{星期}互斥,即表示若分明钦赐{星期}触发,则表示{日期}无意义,防止引起 争辨和芜杂

"," 代表在钦赐的日期触发,比方"1,十,20"代表一号、10号和20号这三天接触

"-" 代表在内定的日子范围内接触,比方"10-一伍"代表从拾号起始触发到15号结束触发,每隔一天接触

"/" 代表触发步进(step),"/"前边的值代表开端值("*"等同"1"),后边的值代表偏移量,比方"1/5"或然"*/5"代表从壹号起始接触,每隔5天触发叁遍;"10/五"代表从10号开首接触,现在每隔四日触发三遍;"1-10/二"表明式意味着在[1,10]范围内,每隔2天触发,即1号,3号,5号,7号,9号触发

"L" 如若{日期}占位符即使是"L",即意味着上月的最后一天接触

"W "意味着在下一个月内离当天以来的职业日触发,所谓近来职业日,即当天到工作日的光景最短距离,假使当天即为工作日,则离开为0;所谓上个月内的传教,正是不能够跨月取到近年来职业日,纵然前/后月份的末段壹天/第三天实在满意近日职业日;由此,"LW"则象征前段日子的末梢贰个职业日触发,"W"强烈依赖{月份}

"C" 根据日历触发,由于选取较少,目前不做表明

{月份} ==> 允许值范围: 壹~1二(JAN-DEC),不允许为空值,若值违法,调解器将抛出SchedulerException极度

"*" 代表每一种月都接触;

"," 代表在钦点的月度触发,举个例子"一,陆,12"代表7月份、八月份和11月份接触职分

"-" 代表在内定的月份范围内接触,比如"一-陆"代表从10月份初步触发到二月份与世长辞触发,每隔二个月触发

"/" 代表触发步进(step),"/"后面包车型客车值代表开端值("*"等同"1"),后边的值代表偏移量,比如"二分之一"恐怕"*/二"代表从1月份初步接触,每隔3个月触发3次;"6/六"代表从3月份开头接触,以往每隔四个月触发一回;"一-6/1二"表明式意味着每年10月份触及

{星期} ==> 允许值范围: 1~七(SUN-SAT),一意味星期一(一星期的首后天),就那样推算,7表示星期伍(1礼拜的结尾壹天),区别意为空值,若值违法,调治器将抛出SchedulerException十分

"*" 代表每星期都接触;

"?" 与{日期}互斥,即表示若明确内定{日期}触发,则表示{星期}无意义,以防引起冲突和混乱

"," 代表在内定的礼拜约定触发,比方"一,三,五"代表周6、周四和星期四触及

"-" 代表在钦点的礼拜范围内接触,比方"贰-肆"代表从周六齐始触发到星期3实现触发,每隔一天接触

"/" 代表触发步进(step),"/"后边的值代表初步值("*"等同"壹"),前面的值代表偏移量,比如"1/3"也许"*/叁"代表从周三开端接触,每隔3天触发3回;"一-5/2"表明式意味着在[1,5]限制内,每隔二天接触,即周天、周三、星期4触及

"L" 要是{星期}占位符假使是"L",即表示星期的的结尾1天接触,即礼拜贰触及,L= 7依然 L = SAT,由此,"伍L"意味着半年的最后四个星期4触及

"#" 用来钦命具体的周数,"#"前面代表星期,"#"后边代表上月第几周,举例"二#二"表示前段时间第壹周的星期一,"5#③"表示上月第壹周的星期肆,因而,"伍L"那种格局只可是是"#"的新鲜情势而已

"C" 遵照日历触发,由于使用较少,暂且不做表明

{年份} ==> 允许值范围: 一玖七零~209九,允许为空,若值不合规,调治器将抛出SchedulerException格外

"*"代表每年都接触;

","代表在钦点的年份才触发,例如"2011,二〇一一,20一三"代表201一年、二零一一年和二〇一一年触及职分

"-"代表在钦赐的年度范围内接触,比方"201一-2020"代表从201一年起来触发到二零二零年了却触发,每隔1年触发

"/"代表触发步进(step),"/"前边的值代表开始值("*"等同"1966"),前边的值代表偏移量,举个例子"201四分之二"或许"*/二"代表从201一年初始接触,每隔二年触发二回

在意:除了{日期}和{星期}能够采纳"?"来促成互斥,表明无意义的音讯之外,别的占位符都要负有现实的时日含义,且信赖关系为:年->月->日期(星期)->时辰->分钟->秒数

下文讲述工作中,需求获得钦定日期在前些日子的职业日

}

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

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

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

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

)

3. cron表达式的强劲魅力在于灵活的横向和纵向整合以及轻易的语法,用cron表明式差不离能够写出别样你想要触发的日子点


  

  

杰出案例:

"30 * * * *苏息日数等日子操作,总括五个日子之间的劳作日数。 ?" 每半分钟触发义务

"30 10 * * * ?" 每时辰的拾叁分30秒触发职责

"30 10 1 * * ?" 每一天一点十一分30秒触发任务

"30 10 1 20 * ?" 每月20号壹点10分30秒触发职分

"30 10 1 20 10 ? *" 每年111月20号一点十三分30秒触发义务

"30 十 一 20 10 ? 2011" 201一年二月20号壹点11分30秒触发职分

"30 10 1 ? 10 * 2011" 201一年六月每一日一点13分30秒触发任务

"30 拾 壹 ? 十 SUN 2011" 201一年1七月每星期四一点拾贰分30秒触发职责

"15,30,45 * * * * ?" 每一5秒,30秒,四伍秒时接触任务

"15-45 * * * * ?" 一5到45秒内,每秒都接触职分

"15/5 * * * * ?" 每分钟的每一伍秒开端接触,每隔5秒触发叁回

"15-30/5 * * * * ?" 每分钟的壹五秒到30秒之内初始接触,每隔5秒触发2回

"0 0/3 * * * ?" 每时辰的第0分0秒伊始,每三分钟触发三次

"0 15 10 ? * MON-F福睿斯I" 星期1到星期陆的十点16分0秒触发职责

"0 15 10 L * ?" 每一种月最后一天的10点一四分0秒触发职分

"0 15 10 LW * ?" 每种月最后三个专门的学业日的10点15分0秒触发任务

"0 15 10 ? * 伍L" 每一个月末了四个星期4的拾点十七分0秒触发义务

"0 15 10 ? * 5#三" 种种月第2周的星期四的拾点15分0秒触发任务

下文讲述常规的钦定职业日所在月的运气分析,
完毕思路:
一 生成二个国度官方假日表(A),非星期天,周一
2 生成一个国家法定补办表(B),涉及星期四星期一调班
3 生成钦定月份的日子流水表(C)
四 获取内定日期的专门的工作日消息,如下所示:

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

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

--例: 获取 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

写个法子计算出除开法定假期的职业日

写个主意总计出除开法定假期的职业日

澳门新浦京娱乐场网站 1

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
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

  

  

推行这么些表值函数后增进调休日和减去法定假日就是工作日了,我们能够再写3个存款和储蓄进程。

实行这一个表值函数后拉长调休日和减去法定假期正是专业日了,大家能够再写1个囤积进程。

 

 

贰,总计钦定日期段的休憩日

2,总括钦命日期段的休息日

那几个跟那些相反,便是周末充裕法定休假在收缩调休日

那些跟那二个相反,正是星期一足够法定休假在减弱调休日

咱俩写四个函数

我们写一个函数

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
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

  

  

 

 

叁、总结当前前月首日期和月末日期

叁、总括当前前月底日期和月末日期

月初

月初

简单:

简单:

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

  

  

月末日期

月末日期

以此也大致回顾:正是月第3天加四月再减去1天

以此也大约归纳:正是月第2天加7月再减去1天

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

  澳门新浦京娱乐场网站 2

  澳门新浦京娱乐场网站 3

 

 

本文由澳门新浦京娱乐场网站发布于数据库,转载请注明出处:苏息日数等日子操作,总括五个日子之间的劳作