2

我有一个带有“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”记录。我的查询有什么问题?

4

2 回答 2

8

OracleDATE列也包含时间(尽管它们的名称)。您现有行的时间可能不同于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')
于 2013-02-15T10:41:46.303 回答
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';
于 2013-02-22T12:18:00.467 回答