我在数据库(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
,这是错误的结果。
如何解决这个问题?
答案 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)
添加了一些修改,以优化具有相同结果的查询。