DATE的Oracle SQL比较返回错误的结果

时间:2015-03-12 08:57:11

标签: sql oracle date select where-clause

我在数据库(REPORTDATE)类型中有DATETIME列。 我想从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')

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

如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

  

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

您正在比较两个 STRINGS 。您需要比较 DATE 。正如我在此处的另一个答案中已经说过的那样,您需要保留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列,因此它将具有datetime元素。因此,如果您想在比较时排除时间元素,则需要使用 TRUNC

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

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

例如,

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

答案 1 :(得分:0)

条件to_char(REPORTDATE, 'DD.MM.YYYY')>'09.11.2013'与字符串进行比较,因此30.10.2013位于09.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)添加了一些修改,以优化具有相同结果的查询。