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这是错误的结果.
怎么解决这个?
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)