我有一个在很多报告中使用的视图。该视图的 DATE 列是主要参数。但现在我必须对所有报告使用一系列日期而不是单个日期;即两个日期列之间的日期。
例如: 该视图具有以下列:COL1、DATE、DATE1、DATE2。 报告(通常)是这样运行的:
SELECT col1, DATE FROM MY_VIEW WHERE DATE <= :PDATE;
我想要的是:
SELECT col1, DATE FROM MY_VIEW WHERE [dates between DATE1 and DATE2] <= :PDATE;
因此,我需要一个视图,其中有一列存储 DATE1 和 DATE2 之间的日期,并且当 :PDATE 等于或小于范围内的任何日期时从查询返回行,而不更改查询。
您需要拆分 WHERE 条件,首先检查日期是否在 Date1 和 date2 之间,然后检查它们是否小于。
仅当两个条件都为真时,您才会返回一行。
SELECT col1, DATE FROM MY_VIEW
WHERE DATE between DATE1 and DATE2
AND DATE <= :PDATE;
您可以生成以下范围内的日期列表:
测试数据:
create table t (
id number generated by default on null as identity
constraint t_id_pk primary key,
date1 date,
date2 date
)
;
-- load data
insert into t ( date1, date2 ) values ( sysdate - 1, sysdate - 8 );
insert into t ( date1, date2 ) values ( sysdate + 1, sysdate - 2 );
select * from t;
ID DATE1 DATE2
---------- ----------- -----------
1 03-OCT-2023 26-SEP-2023
2 05-OCT-2023 02-OCT-2023
select t.id
,d.dt
from t
cross join lateral ( select date2 + level - 1 as dt
from dual
connect by
level < t.date1 - t.date2 + 2
) d
ID DT
---------- -----------
1 26-SEP-2023
1 27-SEP-2023
1 28-SEP-2023
1 29-SEP-2023
1 30-SEP-2023
1 01-OCT-2023
1 02-OCT-2023
1 03-OCT-2023
2 02-OCT-2023
2 03-OCT-2023
2 04-OCT-2023
2 05-OCT-2023
此选择包括下限日期和上限日期。将 connect by 子句中的
t.date2 + 2
更改为 t.date2 + 1
以排除上限日期。
你说DATE2总是大于DATE1。因此,定义了从 DATE1 到 DATE2 的日期范围。要与另一个日期进行比较,只需比较 DATE1 或 DATE2(具体取决于比较),其他日期将满足相同的条件:
WHERE DATE2 <= :PDATE
WHERE DATE1 <= :PDATE
WHERE DATE1 >= :PDATE
WHERE DATE2 >= :PDATE