转自:http://www.maomao365.com/?p=6771
/**//**//**//// <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之间的行事日数
1、查询指定期期距离的专门的学业日
1、查询指定期间间隔的专门的学问日
摘要:997755.com澳门葡京 ,
获得内定日期为本月第多少个工作日,查询钦赐时期间隔职业日数。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;
其一关键困难是官方节日,国家的合法节日年年都区别,还涉嫌到调休,所以大家规划一个假日表。首要字段有年度,类型(是或不是调休),假日日期。如下:
本条首要难题是官方节日,国家的合法节日年年都不一致样,还涉嫌到调休,所以大家安顿一个假期表。主要字段有年度,类型(是不是调休),假日日期。如下:
下文陈说职业中,必要得到钦定日期在上个月的职业日
}
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--类型
)
下文呈报常规的内定职业日所在月的小运分析,
福寿无疆思路:
1 生成几个国家官方假期表(A),非周日,周末
2 生成二个国家官方补办表(B),涉及周天星期天调班
3 生成钦定月份的日期流水表(C)
4 获取钦命日期的工作日音信,如下所示:
增添好当年的假期和调休日期
增添好当年的假期和调休日期
--例: 获取 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
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,总括钦赐日期段的休息日
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
3、总结当前前月尾日期和月末日期
3、总括当前前月中日期和月末日期
月初
月初
简单:
简单:
SELECT CONVERT(VARCHAR(7),GETDATE(),120)+'-01'
SELECT CONVERT(VARCHAR(7),GETDATE(),120)+'-01'
月末日期
月末日期
本条也轻便回顾:正是月第一天加八月再减去一天
以此也简要回顾:正是月第一天加4月再减去一天
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'))