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中收到无效的月份错误。我不知道为什么?
答案 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