使用 rownum 生成日期范围 table
generating range of dates table with rownum
我正在尝试创建一个客户端级别的报告,该报告将从指定了 client_id 的客户端 table 获取 start_date 和 end_date 等信息。之后的想法是根据客户 start_date 和 end_date.
生成 table 范围内的日期
我的问题:是否可以在查询执行时(动态地)创建具有日期范围的 table?
或者:你能否像使用 for 循环那样生成数字序列而不事先定义临时 table 或辅助程序?
例如(甲骨文SQL):
SELECT *
FROM ( SELECT 1 A
FROM DUAL ) A
LEFT JOIN ( SELECT 10 B
FROM DUAL ) B ON B.B = A.A + ROWNUM
您可以使用 connect by level
语法:
SELECT TO_DATE('01/02/03', 'DD/MM/RR') + LEVEL - 1 -- Some arbitrary start date
FROM dual
CONNECT BY LEVEL <= 10 -- Arbitrarily produce 10 rows
您可以将 recursive CTE 用于此目的。
您只需要在 anchor 中传递 start 日期和 stop 日期select 的
递归 CTE
例子
with cal (dt, stop) as (
select date'2022-01-01', date'2022-01-05' from dual
union all
select dt+1, stop from cal
where dt< stop)
select dt from cal;
DT
-------------------
01.01.2022 00:00:00
02.01.2022 00:00:00
03.01.2022 00:00:00
04.01.2022 00:00:00
05.01.2022 00:00:00
对我来说看起来像是普通分层查询。
SQL> with cal (dt, stop) as
2 (select date'2022-01-01', date'2022-01-05' from dual)
3 select dt + level - 1 datum
4 from cal
5 connect by level <= stop - dt + 1;
DATUM
----------
01.01.2022
02.01.2022
03.01.2022
04.01.2022
05.01.2022
SQL>
我正在尝试创建一个客户端级别的报告,该报告将从指定了 client_id 的客户端 table 获取 start_date 和 end_date 等信息。之后的想法是根据客户 start_date 和 end_date.
生成 table 范围内的日期我的问题:是否可以在查询执行时(动态地)创建具有日期范围的 table?
或者:你能否像使用 for 循环那样生成数字序列而不事先定义临时 table 或辅助程序?
例如(甲骨文SQL):
SELECT *
FROM ( SELECT 1 A
FROM DUAL ) A
LEFT JOIN ( SELECT 10 B
FROM DUAL ) B ON B.B = A.A + ROWNUM
您可以使用 connect by level
语法:
SELECT TO_DATE('01/02/03', 'DD/MM/RR') + LEVEL - 1 -- Some arbitrary start date
FROM dual
CONNECT BY LEVEL <= 10 -- Arbitrarily produce 10 rows
您可以将 recursive CTE 用于此目的。
您只需要在 anchor 中传递 start 日期和 stop 日期select 的 递归 CTE
例子
with cal (dt, stop) as (
select date'2022-01-01', date'2022-01-05' from dual
union all
select dt+1, stop from cal
where dt< stop)
select dt from cal;
DT
-------------------
01.01.2022 00:00:00
02.01.2022 00:00:00
03.01.2022 00:00:00
04.01.2022 00:00:00
05.01.2022 00:00:00
对我来说看起来像是普通分层查询。
SQL> with cal (dt, stop) as
2 (select date'2022-01-01', date'2022-01-05' from dual)
3 select dt + level - 1 datum
4 from cal
5 connect by level <= stop - dt + 1;
DATUM
----------
01.01.2022
02.01.2022
03.01.2022
04.01.2022
05.01.2022
SQL>