【问题标题】:NVL in BETWEEN date ANDNVL 在 BETWEEN 日期 AND
【发布时间】:2013-11-27 11:17:15
【问题描述】:

好的,有很多记录,也许一个订单号 = 11233。

部分代码不正确

 AND a.C_DATE BETWEEN TO_DATE (
                                   NVL ('&C_DATE_FROM', '1900-01-01'),
                                   'yyyy-mm-dd')
                            AND TO_DATE (
                                   NVL ('&C_DATE_TO', '2099-12-31'),
                                   'yyyy-mm-dd')

我的问题如果 a.C_DATE 为空,我该如何编写条件??? 现在当 a.C_DATe 为空时我没有记录

我是这样写的

 AND (a.C_DATE BETWEEN TO_DATE (
                                   NVL ('&C_DATE_FROM', '1900-01-01'),
                                   'yyyy-mm-dd')
                            AND TO_DATE (
                                   NVL ('&C_DATE_TO', '2099-12-31'),
                                   'yyyy-mm-dd') OR a.C_DATE IS NULL)

但是我等了很久......

【问题讨论】:

  • 第一:这似乎是一个很长的时间跨度,第二:C_DATE 列是否被索引或至少是索引的一部分?

标签: oracle date between


【解决方案1】:

试试这个:

AND (NVL(a.C_DATE, TO_DATE('1900-01-01','yyyy-mm-dd')) 
     BETWEEN TO_DATE (NVL('&C_DATE_FROM', '1900-01-01'), 'yyyy-mm-dd')
         AND TO_DATE (NVL('&C_DATE_TO',   '2099-12-31'), 'yyyy-mm-dd'))

【讨论】:

  • 它是最好的解决方案。使用 C_DATE IS NULL 之前的解决方案不同,您的解决方案(Mt. Schneiders)大约需要 3-4 分钟;)非常感谢您
  • [Err] ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0
【解决方案2】:

也许是这样?

AND ( 
   a.C_DATE BETWEEN 
       TO_DATE('1900-01-01', 'yyyy-mm-dd') AND TO_DATE ('2099-12-31', 'yyyy-mm-dd') 
   OR a.C_DATE IS NULL
    )

为什么要这么大的日期范围?

【讨论】:

  • 仅一个月6747条记录:)
  • 那么它应该是这样的: AND (a.C_DATE IS NULL or a.C_DATE between ...您想要的月份...并且您应该已经索引了该列
  • 是的,你也有一个好主意,但早期的解决方案(施耐德先生)对我来说还可以,查询很快就会返回结果,但感谢你的帮助 :)
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2022-11-20
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多