oracle 如何在一列中存储多个日期并将其用作日期?

cdmah0mi  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(103)

我有一个在很多报告中使用的观点。该视图具有作为主要参数的日期列。但是现在我必须使用一系列的日期,而不是所有报告的单一日期;即两个日期列之间的日期。
例如:视图包含以下列: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;

因此,我需要一个视图,它有一个列,存储日期之间的DATE 1和DATE 2和行返回查询时:PDATE等于或小于任何日期范围内没有改变查询。

wgeznvg7

wgeznvg71#

你需要拆分WHERE条件,首先检查日期是否在Date1和date2之间,然后检查它们是否更小。
只有当这两个条件都为真时,才会返回一行。

SELECT col1, DATE FROM MY_VIEW 
WHERE DATE between DATE1 and DATE2 
AND DATE <= :PDATE;
svujldwt

svujldwt2#

您可以生成以下范围内的日期列表:
测试数据:

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

此选择包括下限和上限日期。将connectby子句中的t.date2 + 2更改为t.date2 + 1,以排除上边界日期。

xqnpmsa8

xqnpmsa83#

你说DATE2总是大于DATE1。因此,有一个从DATE1到DATE2定义的日期范围。对于与另一个日期的比较,根据比较的不同,比较DATE1或DATE2就足够了,其他日期将满足相同的标准:

范围内的所有日期必须小于或等于:PDATE。

WHERE DATE2 <= :PDATE

范围内至少有一个日期必须小于或等于:PDATE。

WHERE DATE1 <= :PDATE

范围内的所有日期必须大于或等于:PDATE。

WHERE DATE1 >= :PDATE

范围内至少有一个日期必须大于或等于:PDATE。

WHERE DATE2 >= :PDATE

相关问题