【问题标题】:Oracle SQL with Date Range具有日期范围的 Oracle SQL
【发布时间】:2021-04-14 03:19:16
【问题描述】:

我有这个日期范围的表格:

SID StartDate EndDate CID Time_Stamp
1001 2021-04-14 2021-04-15 1002 2021-04-14
1003 2021-04-14 2021-04-16 1004 2021-04-14

我需要分解日期,使其看起来像这样。

SID StartDate EndDate CID Time_Stamp
1001 2021-04-14 2021-04-15 1002 2021-04-14
1001 2021-04-15 2021-04-15 1002 2021-04-14
1003 2021-04-14 2021-04-16 1004 2021-04-14
1003 2021-04-15 2021-04-16 1004 2021-04-14
1003 2021-04-16 2021-04-16 1004 2021-04-14

我有以下代码,但它没有分解日期,只给出日期范围。

if trunc(EndDate) > trunc(StartDate) then
   lv_start_date := trunc(StartDate);
   WHILE trunc(lv_start_date) <= trunc(EndDate) LOOP
     insert into mytable values (SID, trunc(lv_start_date), trunc(EndDate), 
                                        CID,Time_Stamp);
     commit;
     lv_start_date := lv_start_date + 1;
   END LOOP;
end if;

有没有办法改进代码以获得预期的结果?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    一点层次查询,你就得到你想要的:

    SQL> select sid,
      2         startdate + column_value - 1 as startdate,
      3         enddate,
      4         cid,
      5         time_stamp
      6  from test cross join
      7    table(cast(multiset(select level from dual
      8                        connect by level <= enddate - startdate + 1
      9                       ) as sys.odcinumberlist))
     10  order by sid, startdate;
    
           SID STARTDATE  ENDDATE           CID TIME_STAMP
    ---------- ---------- ---------- ---------- ----------
          1001 2021-04-14 2021-04-15       1002 2021-04-14
          1001 2021-04-15 2021-04-15       1002 2021-04-14
          1003 2021-04-14 2021-04-16       1004 2021-04-14
          1003 2021-04-15 2021-04-16       1004 2021-04-14
          1003 2021-04-16 2021-04-16       1004 2021-04-14
    
    SQL>
    

    【讨论】:

    • 这也很有效。如果我想删除从 select 语句中得到的结果怎么办?它会是什么样子?
    • 一个选项可能是这样的:delete from test where sid in (select sid from test cross join ... as sys.odcinumberlist)));
    猜你喜欢
    • 2016-10-25
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多