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

问题描述 投票:0回答:3

我有一个在很多报告中使用的视图。该视图的 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 等于或小于范围内的任何日期时从查询返回行,而不更改查询。

sql oracle view oracle-apex
3个回答
0
投票

您需要拆分 WHERE 条件,首先检查日期是否在 Date1 和 date2 之间,然后检查它们是否小于。

仅当两个条件都为真时,您才会返回一行。

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

0
投票

您可以生成以下范围内的日期列表:

测试数据:

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
以排除上限日期。


0
投票

你说DATE2总是大于DATE1。因此,定义了从 DATE1 到 DATE2 的日期范围。要与另一个日期进行比较,只需比较 DATE1 或 DATE2(具体取决于比较),其他日期将满足相同的条件:

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

WHERE DATE2 <= :PDATE

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

WHERE DATE1 <= :PDATE

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

WHERE DATE1 >= :PDATE

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

WHERE DATE2 >= :PDATE
© www.soinside.com 2019 - 2024. All rights reserved.