列出SQL中日期范围内的所有日期,但忽略银行假日

时间:2016-10-24 08:02:58

标签: sql-server tsql

我正在做假日经理。

我有一张表,其中列出了每个假日实例的开始和结束日期。

  

[LeaveID],[EmployeeID],[StartDate],[EndDate]

我也有一个日历表,其中包含2016 - 2030年的日期,列出了日期格式的常规变化以及工厂关闭的时间,包括银行假期等。

我正在为前端工作,现在他们希望我以某种日历格式显示它,所以我需要在每天标记,谁已预订了休息时间。

我想我需要列出每个日期范围内的每个日期(开始日期到结束日期),然后检查日历上的每个日期是否出现在该列表中。

所以基本上我需要获取日期范围内的日期列表。

最重要的是。我希望能够将上面的日期列表与日历表进行比较,以便在计算每个实例使用的假日数量时忽略银行假日。

提前致谢!

2 个答案:

答案 0 :(得分:1)

要获取日期范围内的日期列表,您需要从1到n的数字来源。我通常创建这样的表并将其称为Numbers表。

要生成范围内的日期列表,请使用以下查询。

SELECT
    DATEADD(DAY, Numbers.Number-1, [StartDate]) Date
FROM
    Numbers
WHERE
    DATEADD(DAY, Numbers.Number-1, [StartDate]) <= [EndDate]

要创建此类表格,请参阅this问题。

如果您想列出Employee表中的所有日期,只需交叉加入即可。

SELECT
    e.EmployeeID, 
    DATEADD(DAY, n.Number-1, e.[StartDate]) Date
FROM
    Numbers n, Employee e
WHERE
    DATEADD(DAY, n.Number-1, e.[StartDate]) <= e.[EndDate]

答案 1 :(得分:0)

由于您已有日期表,因此您不需要其他答案中提到的数字表。要完成您的目标,需要一个简单的SQL Join from 您的日期表。根据您希望格式化最终报告的方式,您可以count更新返回的EmployeeID个数,或将它们全部分组到DateValue前端的日历/表格控件中

在下面的查询中,对于范围中指定的每个日期(您可以应用自己的过滤,例如DateValue等),您将获得至少一个where Dates.BankHoliday = 0,并且多个员工可以使用多个-- Build some dummy data to run the query against. declare @Emp table (LeaveID int, EmployeeID int , StartDate datetime, EndDate datetime); insert into @Emp values (1,1,'20161101','20161105') ,(2,1,'20161121','20161124') ,(3,2,'20161107','20161109') ,(4,3,'20161118','20161122'); declare @Dates table (DateKey int, DateValue datetime, DateLabel nvarchar(50)); declare @s datetime = '20161025'; with cte as ( select cast(convert(nvarchar(8),@s,112) as int) as DateKey ,@s as DateValue ,convert(nvarchar(50),@s,103) as DateLabel union all select cast(convert(nvarchar(8),DateValue+1,112) as int) ,DateValue+1 ,convert(nvarchar(50),DateValue+1,103) from cte where DateValue+1 <= '20161205' ) insert into @Dates select * from cte; -- Actually query the data. -- Define the start and end of your date range to return. declare @MinStart datetime = (select min(StartDate) from @Emp); declare @MaxEnd datetime = (select max(EndDate) from @Emp); select d.DateValue ,e.EmployeeID from @Dates d left join @Emp e on(d.DateValue between e.StartDate and e.EndDate) where d.DateValue between @MinStart and @MaxEnd order by d.DateValue ,e.EmployeeID; 已休假:

UIView