【问题标题】:Sick days per month query - overlapping months sick leave applications每月病假天数查询——重叠月份病假申请
【发布时间】:2018-04-16 00:12:26
【问题描述】:

我正在尝试运行查询以提取员工每月请病假的天数。我的查询的问题是它没有考虑任何重叠的日子。例如,病假可能是从 3 月 29 日到 4 月 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'

谢谢

【问题讨论】:

  • 不确定我理解您所说的“重叠”是什么意思 - 如果您按月查询,您不能每个月运行此查询,然后跨月进行一些累积吗?

标签: sql sql-server


【解决方案1】:

这些是 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。这应该不是必需的,它只会增加查询的开销(用于删除重复项)。

join 上的 collate 可疑。对于员工编号来说,这确实不需要,它应该有一个规范的格式。

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

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

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' ;

但是,这不会针对非工作日进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2019-10-23
    • 2015-11-23
    • 2022-12-12
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多