Oracle - 将多列与日期范围进行比较

时间:2018-03-16 15:08:53

标签: sql oracle date plsql date-range

我有读取数据库的权限。我想检查与多个表关联的许多(日期)列,以查看这些列中的任何列的值是否超出指定范围。

例如,我可能以相同的日期格式使用TBL1.from_date,TBL2.from_date,TBL2.to_date,TBL3.birthdate。我想检查所有列以查看它们是否落在1990 - 2025年之间,而不是对每列的日期范围进行硬编码。我知道我可以将IN子句用于单个值,但不知道如何专门用它来进行比较。

当前SQL查询:

select TBL_A.acct_no
from   TBL_A, TBL1, TBL2, TBL3
where  TBL_A.acct_no = TBL1.acct_no and
       TBL1.acct_no  = TBL2.acct_no and
       TBL2.acct_no  = TBL3.acct_no and
       (
       TBL1.from_date < '01-JAN-1990' or 
       TBL1.from_date > '01-JAN-2025' or 
       TBL2.from_date < '01-JAN-1990' or 
       TBL2.from_date > '01-JAN-2025' or 
       TBL2.to_date   < '01-JAN-1990' or 
       TBL2.to_date   > '01-JAN-2025' or 
       TBL3.birthdate < '01-JAN-1990' or 
       TBL3.birthdate > '01-JAN-2025' or 
       );

我正在尝试实现的SQL查询示例:

select TBL_A.acct_no
from   TBL_A, TBL1, TBL2, TBL3
where  TBL_A.acct_no = TBL1.acct_no and
       TBL1.acct_no  = TBL2.acct_no and
       TBL2.acct_no  = TBL3.acct_no and
       -- psudo-code
       (date range) not in (TBL1.from_date, TBL2.from_date, TBL2.to_date, TBL3.birthdate);

1 个答案:

答案 0 :(得分:0)

您可以使用least()greatest()函数将最小列值与下边界和最大列值与上边界进行比较:

...and (
   least(    tbl1.from_date, tbl2.from_date, tbl2.to_date) < '01-JAN-1990' or
   greatest( tbl1.from_date, tbl2.from_date, tbl2.to_date) > '01-JAN-2025'
)