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

Dej*_*jan 2 sql oracle select date where-clause

REPORTDATE在database(DATETIME)类型中有列.我想只DATE从DATETIME中提取值,然后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')
Run Code Online (Sandbox Code Playgroud)

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

怎么解决这个?

Lal*_*r B 8

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

您正在比较两个STRINGS.您需要比较日期.正如我在此处的另一个答案中已经说过的那样,您需要保留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') 
Run Code Online (Sandbox Code Playgroud)

另外,REPORTDATE是一个DATE列,因此它将具有datetime元素.因此,如果要在比较时排除时间元素,则需要使用TRUNC

WHERE TRUNC(REPORTDATE) > TO_DATE('09.11.2013', 'DD.MM.YYYY')
Run Code Online (Sandbox Code Playgroud)

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

例如,

WHERE REPORTDATE
BETWEEN 
        TO_DATE('09.11.2013', 'DD.MM.YYYY')
AND     
        TO_DATE('09.11.2013', 'DD.MM.YYYY') +1
Run Code Online (Sandbox Code Playgroud)