我在sql server数据库中有一个视图,其中有员工的考勤和像这样存储的数据
------------------------------------------------------------------
ID | EmpID | Name | ArrivalTime | LeavingTime | DayDate
------------------------------------------------------------------
1 | 5 | Hassan | 9.00AM | 5.50PM | 19-11-2010
------------------------------------------------------------------
1 | 5 | Hassan | 8.50AM | 5.00PM | 20-11-2010
------------------------------------------------------------------
1 | 5 | Hassan | 8.30AM | 4.54PM | 23-11-2010
------------------------------------------------------------------
他在该公司的开始日期存储在主EmployeeTable中,作为开始日期列和结束日期我想根据上面的数据获得该员工的缺勤天数,并且必须以EmployeeTable中存储的StartDate开始,如果他有EndDate,则必须以EndDate结束。例如,该员工于2010年10月20日开始与我们合作他在考勤表上的第一天是2010年5月11日,我希望这些日子像一样一天一天地出现在视图中
------------------------------------------------------------------
ID | EmpID | Name | AbsenceDay
------------------------------------------------------------------
1 | 5 | Hassan | 21-10-2010
------------------------------------------------------------------
1 | 5 | Hassan | 22-10-2010
------------------------------------------------------------------
1 | 5 | Hassan | 23-10-2010
------------------------------------------------------------------
等等以及
------------------------------------------------------------------
ID | EmpID | Name | AbsenceDay
------------------------------------------------------------------
1 | 5 | Hassan | 21-11-2010
------------------------------------------------------------------
1 | 5 | Hassan | 22-11-2010
------------------------------------------------------------------
考勤表中的缺勤日期提前感谢。
我知道您想要员工在其雇佣期内未参加的所有日期。
一种选择是使用递归查询生成雇佣天数列表,然后使用not exists
进行筛选。
with cte as (
select empID, name, startDate, endDate from employees
union all
select empID, name, dateadd(day, 1, startDate), endDate
from cte
where startDate < endDate
)
select empID, name, startDate absenceDay
from cte c
where not exists (
select 1 from attendances a where a.empID = c.empID and a.dayDate = c.startDate
)
如果雇用期超过3个月,则可以在查询的最后添加option (maxrecursion 0)
。