【问题标题】:Expand Range of dates in rows - Oracle SQL扩展行中的日期范围 - Oracle SQL
【发布时间】:2022-01-13 21:25:51
【问题描述】:

我的记录显示员工在 2021 年 3 月 23 日至 2021 年 3 月 26 日期间休了年假,即 3 天,如下所示。

我正在尝试将记录拆分为三个开始日期和结束日期以获取单独的记录。例如:

这样做的主要原因是组织一个月内休假的总和。

这可能吗?尝试了几种不同的方法,但都没有成功。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    这是一种选择;在代码中读取 cmets。

    SQL> with
      2  -- sample data
      3  data (id, start_date, end_date, att_type, descr, abs_days, abs_hours) as
      4    (select 1, date '2021-04-23', date '2021-04-26', 3000, 'ANN', 3, 29 from dual),
      5  -- calculate number of days when person identified by ID has been absent
      6  temp (id, diff) as
      7    (select id, end_date - start_date
      8     from data
      9    )
     10  -- hierarchical query, to create as many rows as there are days. Cross join is here
     11  -- to avoid duplicates when you run that query for more than a single person
     12  select
     13    d.id,
     14    d.start_date + column_value - 1 start_date,
     15    d.start_date + column_value     end_date,
     16    d.att_type,
     17    d.descr,
     18    d.abs_days / t.diff abs_days,
     19    round(d.abs_hours / t.diff, 2) abs_hours
     20  from data d join temp t on t.id = d.id
     21  cross join table(cast(multiset(select level from dual
     22                                 connect by level <= t.diff
     23                                ) as sys.odcinumberlist))
     24  order by d.id, d.start_date;
    
            ID START_DATE END_DATE     ATT_TYPE DES   ABS_DAYS  ABS_HOURS
    ---------- ---------- ---------- ---------- --- ---------- ----------
             1 23/04/2021 24/04/2021       3000 ANN          1       9,67
             1 24/04/2021 25/04/2021       3000 ANN          1       9,67
             1 25/04/2021 26/04/2021       3000 ANN          1       9,67
    
    SQL>
    

    在我看来,您在示例数据中发布的ABS_HOURS 是错误的。工作日有尽可能多的时间(在这里,我住的地方,每天 8 小时),每 3 天正好有 24 小时。如果您居住的地方不同,那没问题 - 可能是 9 小时或 10 小时,但这个数字(或者,至少,应该)每天都一样。因此,我认为每 3 天 29 小时是错误的。

    这反映了最终查询中的ABS_HOURS。你想要 9.6 + 9.6 + 9.7 来制作 29 小时。这并不容易(至少对我来说不是)所以在这种情况下我会切换到 PL/SQL。

    【讨论】:

    • 谢谢!这是有道理的,而且有效。
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多