我有一个带有'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”的记录。 我的查询出了什么问题?
答案 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';