【问题标题】:SQL - Create multiple records from 1 record based on days between 2 datesSQL - 根据 2 个日期之间的天数从 1 个记录创建多个记录
【发布时间】:2020-10-23 12:48:38
【问题描述】:

我有一张存放员工休假的桌子。如果员工连续休假超过 1 天,例如 22-05-2020 到 26-05-2020,这将显示为一条记录。我正在尝试将此显示为 5 条记录,它们每天关闭。

我的表名为:Emp_Annual_Leave 并具有以下字段

emp_no      leave_type      leave_year      half_day    start_date  end_date    days_of_leave
12345       Annual          2020            N           22/05/2020  26/05/2020  5

上面是它当前的显示方式,我正在尝试显示上面的记录,如下所示:

emp_no  leave_type  leave_year  half_day    start_date  end_date    days_of_leave   leave_date
12345   Annual      2020        N           22/05/2020  26/05/2020  1               22/05/2020
12345   Annual      2020        N           22/05/2020  26/05/2020  1               23/05/2020
12345   Annual      2020        N           22/05/2020  26/05/2020  1               24/05/2020
12345   Annual      2020        N           22/05/2020  26/05/2020  1               25/05/2020
12345   Annual      2020        N           22/05/2020  26/05/2020  1               26/05/2020

有人知道我会这样做吗?我觉得我需要使用 ROW_NUMBER() OVER(PARTITION BY) 但我所做的任何尝试都没有奏效。

提前致谢,

编辑: 我需要在这里创建的表是更大查询中的子查询,需要连接回我的数据库中的其他查询和表。我没有将此作为原始问题的一部分,现在更新为包括在内,以防这会影响我需要使用的方法

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • 我正在使用 MicrosoftSQLServer2014
  • 您是在寻找快速答案还是在考虑不同的方法?
  • 理想情况下,我需要该表在今天正常工作,因为我需要在周一数据库更新之前将其恢复为某些内容,但这将是一个长期解决方案,因此我还需要考虑不同的方法和什么对数据库最有效。我正在寻找的上述输出实际上也需要在我的整体解决方案中用作子查询,所以我不确定使用 CTE 是否会成为我的最佳解决方案(我在这里也可能是错误的)跨度>

标签: sql sql-server datetime recursive-query


【解决方案1】:

您可以使用递归查询:

with cte as (
    select emp_no, leave_type, leave_year, half_day, start_date, end_date, days_of_leave, start_date as leave_date from emp_annual_leave 
    union all
    select emp_no, leave_type, leave_year, half_day, start_date, end_date, days_of_leave, dateadd(day, 1, leave_date)
    from cte
    where leave_date < end_date
)
select * from cte

如果给定的假期可能超过 100 天,您需要在查询末尾添加 option (maxrecursion 0)

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多