我试图运行一个查询来提取员工每个月的病假天数。我的查询的问题是它没有考虑任何重叠的日子。例如,病假可能是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'
由于
答案 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' ;
但是,这不适用于非工作日。