【问题标题】:Create table with multiple timetable sequences when start and end dates are given (Oracle SQL)在给定开始日期和结束日期时创建具有多个时间表序列的表 (Oracle SQL)
【发布时间】:2022-06-28 22:35:39
【问题描述】:

我正在学习 SQL,并且刚刚开始将它用于业务。客户有Oracle系统的数据库。

作为一个查询的响应,我有一个如下表,

/* Defined as START_END_DATE_TABLE*/

Members      | Start      | End
-------------+------------+-----------
John         | 2020-01-07 | 2021-06-10   
Smith        | 2021-01-12 | 2021-02-24   
Brown        | 2021-01-24 | 2022-05-01 

(假设“开始”和“结束”列中的元素类型已经转换为 DATE)

使用上面的表,我想用如下查询方法(Oracle SQL)获取新表,

Members      | DATETIME
-------------+------------
John         | 2020-01-07 
John         | 2020-01-08 
...          | ... 
John         | 2021-06-09 
John         | 2021-06-10 
Smith        | 2021-01-12
Smith        | 2021-01-13
...          | ...
Smith        | 2021-02-23
Smith        | 2021-02-24  
Brown        | 2021-01-24
Brown        | 2021-01-25
...          | ...
Brown        | 2022-04-30
Brown        | 2022-05-01

如何使用 Oracle SQL 获取上表?

我看到了一个与SQL Server相关的类似问题,但我无法完全理解。 Create a list with dates which are in between start and end dates

如果你能告诉我简单的指南来解决我的问题,我非常感激。

【问题讨论】:

标签: sql oracle date


【解决方案1】:

从 Oracle 12 开始,您可以使用 LATERAL 连接到分层查询:

SELECT members,
       day
FROM   table_name t
       CROSS JOIN LATERAL (
         SELECT Start_DT + LEVEL - 1 AS day
         FROM   DUAL
         CONNECT BY Start_DT + LEVEL - 1 <= End_DT
       );

您还可以使用递归子查询分解子句:

WITH rsqfc (members, day, end_dt) AS (
  SELECT * FROM table_name
UNION ALL
  SELECT members, day + 1, end_dt
  FROM   rsqfc
  WHERE  day + 1 <= end_dt
)
SEARCH DEPTH FIRST BY members SET order_rn
SELECT members, day
FROM   rsqfc

其中,对于样本数据:

CREATE TABLE table_name (Members, Start_DT, End_DT) AS
SELECT 'John',  DATE '2020-01-07', DATE '2021-06-10' FROM DUAL UNION ALL
SELECT 'Smith', DATE '2021-01-12', DATE '2021-02-24' FROM DUAL UNION ALL
SELECT 'Brown', DATE '2021-01-24', DATE '2022-05-01' FROM DUAL;

两个输出:

MEMBERS DAY
John 2020-01-07 00:00:00
John 2020-01-08 00:00:00
John 2020-01-09 00:00:00
... ...
John 2021-06-08 00:00:00
John 2021-06-09 00:00:00
John 2021-06-10 00:00:00
Smith 2021-01-12 00:00:00
Smith 2021-01-13 00:00:00
Smith 2021-01-14 00:00:00
... ...
Smith 2021-02-22 00:00:00
Smith 2021-02-23 00:00:00
Smith 2021-02-24 00:00:00
Brown 2021-01-24 00:00:00
Brown 2021-01-25 00:00:00
Brown 2021-01-26 00:00:00
... ...
Brown 2022-04-29 00:00:00
Brown 2022-04-30 00:00:00
Brown 2022-05-01 00:00:00

db小提琴here

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多