我正在做假日经理。
我有一张表,其中列出了每个假日实例的开始和结束日期。
[LeaveID],[EmployeeID],[StartDate],[EndDate]
我也有一个日历表,其中包含2016 - 2030年的日期,列出了日期格式的常规变化以及工厂关闭的时间,包括银行假期等。
我正在为前端工作,现在他们希望我以某种日历格式显示它,所以我需要在每天标记,谁已预订了休息时间。
我想我需要列出每个日期范围内的每个日期(开始日期到结束日期),然后检查日历上的每个日期是否出现在该列表中。
所以基本上我需要获取日期范围内的日期列表。
最重要的是。我希望能够将上面的日期列表与日历表进行比较,以便在计算每个实例使用的假日数量时忽略银行假日。
提前致谢!
答案 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