每月生病日查询 - 重叠病假申请

时间:2018-04-16 00:12:27

标签: sql sql-server

我试图运行一个查询来提取员工每个月的病假天数。我的查询的问题是它没有考虑任何重叠的日子。例如,病假可能是3月29日至4月3日。因此,根据我在下面的查询,这个假期将不会被捕获,因为它会查看3月之前的结束日期(以获取3月份的所有日期)。

我如何捕捉重叠的日子,例如它应该只显示3月29日,3月30日,3月31日,所以3月份为3月。

Select DISTINCT l.emp_number, l.leave_start, l.leave_end, l.leave_type, 
l.lve_days, e.division, e.location
FROM Leave as l Left Join Employees as E on l.emp_number = e.emp_number 
COLLATE SQL_Latin1_General_CP1_CI_AS 
WHERE l.leave_start > = '2018-03-01' AND l.leave_end < '2018-04-01'

由于

1 个答案:

答案 0 :(得分:2)

这些是2018年3月休假的人的正确条件:

Select l.emp_number, l.leave_start, l.leave_end, l.leave_type, 
       l.lve_days, e.division, e.location
from Leave l Left Join
     Employees E
     on l.emp_number = e.emp_number collate SQL_Latin1_General_CP1_CI_AS 
where l.leave_start < '2018-04-01' and l.leave_end >= '2018-03-01' ;

我删除了select distinct。这不应该是必要的,它只会增加查询的开销(用于删除重复项)。

collate上的join是可疑的。对于员工编号,实际上不需要这样做,该编号应具有规范格式。

如果您想要一个月中的天数,那么您可能需要一个日历表。并非所有日子都可能在工作日。

您可以调整返回的时间段:

Select l.emp_number,
       (case when l.leave_start < '2018-03-01' then '2018-03-01' else l.leave_start end) as leave_start,
       (case when l.leave_end >= '2018-04-01' then '2018-03-31' else l.leave_end) as leave_end,
       l.leave_type, 
       l.lve_days, e.division, e.location
from Leave l Left Join
     Employees E
     on l.emp_number = e.emp_number collate SQL_Latin1_General_CP1_CI_AS 
where l.leave_start < '2018-04-01' and l.leave_end >= '2018-03-01' ;

但是,这不适用于非工作日。