【问题标题】:Oracle - Compare Multiple Columns to Date RangeOracle - 将多列与日期范围进行比较
【发布时间】:2018-08-25 17:04:10
【问题描述】:

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

例如,我可能有 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);

【问题讨论】:

  • 您确定条件会检查它们是在 1990 - 2025 之间还是在 1990 - 2025 之外?
  • 外部 - 我更新了我的帖子。谢谢!
  • 这些列中是否允许或存在NULL 值?如果没有,那么@smrtskpr 的答案可能对你有用。

标签: sql oracle date plsql date-range


【解决方案1】:

您可以使用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'
)

【讨论】:

  • 假设没有一列包含NULL 值,是的。
  • 感谢您的建议。不幸的是,空列在这里很常见
  • least(nvl(tbl1.from_date, '01-JAN-1990'),nvl(tbl2.from_date, '01-JAN-1990'))
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2017-08-26
相关资源
最近更新 更多