oracle sql日期比较不能按预期工作

时间:2013-02-15 10:39:15

标签: sql oracle select oracle-sqldeveloper

我有一个带有'insert_date'列的表格X.此列为od类型DATE,并且只包含所有记录的一个值:“17-JAN-13”。我希望以下查询根本不返回任何结果:

SELECT insert_date
FROM X
  WHERE ("X"."INSERT_DATE" IS NOT NULL
  AND NOT (("X"."INSERT_DATE" = to_date('2013-01-17', 'yyyy-mm-dd')
  )))

但我得到的却是很多“17-JAN-13”的记录。 我的查询出了什么问题?

2 个答案:

答案 0 :(得分:8)

Oracle DATE列也包含时间(尽管名称相同)。您现有的行的时间可能不同于00:00:00(“分配”到您使用to_date()函数创建的日期)。

您需要使用trunc()

“删除”列的时间部分
AND NOT (trunc(X.INSERT_DATE) = to_date('2013-01-17', 'yyyy-mm-dd'))

虽然我更愿意使用<>代替NOT运算符:

AND (trunc(X.INSERT_DATE) <> to_date('2013-01-17', 'yyyy-mm-dd'))

(但这只是个人偏好。我认为这使条件更容易阅读。)

所以你的完整陈述将是:

SELECT insert_date
FROM X
  WHERE trunc(X.INSERT_DATE) <> to_date('2013-01-17', 'yyyy-mm-dd')

答案 1 :(得分:0)

您可以在比较时截断时间部分,或者只提取所需的部分,例如DD-MON-YYYY

SELECT insert_date FROM X 
WHERE X.INSERT_DATE IS NOT NULL and to_char(x.INSERT_DATE,'DD-MON-YYYY') <> '17-JAN-2013';