【问题标题】:oracle date issueoracle日期问题
【发布时间】:2013-02-27 00:02:33
【问题描述】:

我有一个名为ORDER 的表,其列cancel_date_time。我正在使用:

to_char(cancel_date_time,'YYYYMMDD HH24:MI:SS')
    not between ('20120214 10:00:00')
            and ('20120215 10:00:00') 

检索记录。但是当cancel_date_timeNULL 时它不会返回任何记录吗?

谁能建议检索记录的问题是什么?

【问题讨论】:

  • 您似乎不知道您要达到的目标。 Null 没有值,因此在您询问如何为空值编码之前,您必须知道如果它们存在您想要做什么。此外,像这样使用 to_char 会减慢您的查询速度。请改用真实的日期时间参数。
  • @Dan:是的,我不知道这个特殊情况,请给我一些提示
  • 如果您是为其他人执行此操作,并且您不确定要求,请询问该人。
  • @Dan:如果您正确理解了这个问题,我的意思是当cancel_date_timeNULL 时不返回任何记录。这意味着不介于两者之间的条件正在失效。这并不意味着如果 cancel_date_time 为 null 则带上记录
  • 我不明白最后的评论。简单的问题 - 如果取消日期时间为空,您的查询是否应该返回该记录?是还是不是?

标签: mysql sql oracle plsql


【解决方案1】:

Null 不是一个值,因此它不能与其他值进行比较。

你可以使用这样的结构:

    ...
    where
      nvl (cancel_date_time, date_value_for_empty_cancel_date) 
      not between ('20120214 10:00:00') and ('20120215 10:00:00')

日期的字符串文字也是 NLS 依赖的,并且 to_char 可能会阻止使用索引。

【讨论】:

  • :date_value_for_empty_cancel_date .它应该有什么值。
  • 搜索范围内的值(如果您想从结果中排除未取消的订单)或范围外的值(如果必须包含这些记录)。这取决于您的业务逻辑。
  • 这是个好主意。 nvl (cancel_date_time, to_date('20120101 11:00:00','YYYYMMDD HH24:MI:SS) ) 不在 ('20120214 10:00:00') 和 ('20120215 10:00:00') 之间。但是给出错误
  • cancel_date_time 是 char 类型,而不是日期吗? HH24:MI:SS 之后也缺少引号
  • 我会尝试用具有显式格式的 to_date 表达式替换文字 ('20120214 10:00:00')。
【解决方案2】:

如果您想要cancel_date_timeNULL 的行以及cancel_date_time 不在两个日期之间的任何行

WHERE cancel_date_time NOT BETWEEN to_date( '20120214 10:00:00','YYYYMMDD HH24:MI:SS') 
                               AND to_date( '20120215 10:00:00','YYYYMMDD HH24:MI:SS')
   OR cancel_date_time IS NULL

您不想将函数应用于可能被索引的列。如果您想要日期比较语义,您希望将日期与日期进行比较。最后,由于NULL 永远不会等于也永远不会不等于任何其他值,因此您需要显式检查IS NULL

【讨论】:

  • 即使日期为空,我的场景也不检索记录
  • @user2113371 - 您在问题中发布的查询不会返回 cancel_date_timeNULL 的行。在您的问题中,您说这是一个问题,并且您想要检索这些行。
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多