Oracle SQL 日期比较 returns 错误结果

Oracle SQL comparison of DATEs returns wrong result

我在数据库 (DATETIME) 类型中有 REPORTDATE 列。 我只想从 DATETIME 中提取 DATE 值,然后每天执行 COUNT 并放置 WHERE 子句以仅限制晚于某个特定日期的日期。

所以我有这个条款:

SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(*) from INCIDENT
where to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'

GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')

它 returns 我的结果,但我可以注意到错误的结果,例如: 30.10.2013 这是错误的结果。

如何解决?

WHERE to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'

您正在比较两个 STRINGS。您需要比较 DATEs。正如我在此处的其他答案中所说的那样,您需要保留日期以进行 DATE 计算。 TO_CHAR是为了显示,TO_DATE是把一个字符串字面量转成DATE。

SELECT TO_CHAR(REPORTDATE, 'DD.MM.YYYY'),
  COUNT(*)
FROM TABLE
WHERE REPORTDATE > TO_DATE('09.11.2013', 'DD.MM.YYYY')
GROUP BY TO_CHAR(REPORTDATE, 'DD.MM.YYYY') 

此外,REPORTDATE 是 DATE 列,因此它将具有日期时间元素。所以,如果你想在比较时排除时间元素,你需要使用TRUNC

WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')

但是,在日期 column 上应用 TRUNC 会抑制该 index 上的任何常规 index柱子。从性能的角度来看,最好使用 日期范围条件 .

例如,

WHERE REPORTDATE
BETWEEN 
        TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND     
        TO_DATE('09.11.2013', 'DD.MM.YYYY') +1

条件to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'比较字符串,所以30.10.201309.11.2013之后。 您需要比较日期,而不是字符串值,因此您必须将查询更改为以下内容。

SELECT to_char(REPORTDATE, 'DD.MM.YYYY') AS MY, COUNT(1) 
from INCIDENT
where trunc(REPORTDATE)> to_date('09.11.2013', 'DD.MM.YYYY')
GROUP BY to_char(REPORTDATE, 'DD.MM.YYYY')

注意:我从count(*)添加了一点修改到count(1)以优化具有相同结果的查询。