在oracle中没有有效的月份错误

时间:2015-03-31 04:32:57

标签: oracle

SELECT c.CYCLE_OID,
SUM(CASE 
WHEN a.NAME = 'Loading' 
    THEN '1' 
ELSE '0' 
END) AS LOAD_COUNT from CYCLE c 
INNER JOIN mssolhist.CYCLEACTIVITYCOMPONENT a on a.OID = c.CYCLE_OID
WHERE c.STARTTIME_UTC >= to_date(to_char(sysdate-10,'dd-MM-yyyy')) AND     c.ENDTIME_UTC <= to_date(to_char(sysdate-5,'dd-MM-yyyy'))
GROUP BY c.CYCLE_OID 

ORA-01843: not a valid month

; nested exception is java.sql.SQLDataException: ORA-01843: not a valid month

使用此to_date表达式时,我在oracle中收到无效的月份错误。我不知道为什么?

3 个答案:

答案 0 :(得分:1)

似乎有两种方法可以避免错误。

首先,您尝试将date转换为字符串,然后再转换为date。你不需要这样做。只需按原样使用日期。

WHERE c.STARTTIME_UTC >= sysdate-10 AND c.ENDTIME_UTC <= sysdate-5

如果要截断时间部分,请使用trunc函数。

WHERE c.STARTTIME_UTC >= trunc(sysdate-10) AND trunc(c.ENDTIME_UTC <= sysdate-5)

或者,如果使用to_char有特殊原因,那么当您尝试将字符串转换为date时,最好指定日期格式。

WHERE c.STARTTIME_UTC >= to_date(to_char(sysdate-10,'DD-MM-YYYY'), 'DD-MM-YYYY') 
  AND c.ENDTIME_UTC <= to_date(to_char(sysdate-5,'DD-MM-YYYY'), 'DD-MM-YYYY')

to_date函数具有可选的fmt参数。如果省略fmt,将使用默认格式。默认格式由NLS_TERRITORY隐式确定,或者可由NLS_DATE_FORMAT参数显式设置。

答案 1 :(得分:1)

基于to_date(to_char(sysdate-10,'dd-MM-yyyy'),'dd-MM-yyyy')

to_date(to_char(sysdate-10,'dd-mon-yyyy'),'dd-mon-yyyy')

答案 2 :(得分:0)

请使用以下查询,它将正常工作。

SELECT c.CYCLE_OID,
SUM(CASE 
WHEN a.NAME = 'Loading' 
    THEN '1' 
ELSE '0' 
END) AS LOAD_COUNT from CYCLE c 
INNER JOIN mssolhist.CYCLEACTIVITYCOMPONENT a on a.OID = c.CYCLE_OID
WHERE c.STARTTIME_UTC >= to_date(to_char(sysdate-10,'dd-MM-yyyy'),'dd-MM-yyyy') AND     c.ENDTIME_UTC <= to_date(to_char(sysdate-5,'dd-MM-yyyy'),'dd-MM-yyyy')
GROUP BY c.CYCLE_OID