2015-03-31 124 views
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')) 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中出现无效的月份错误。我不知道为什么?在oracle中不是一个有效的月份错误

回答

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明确设置。

+0

我原来的sql查询在sql developer中传递,但在我试图通过jenkins运行时失败。 – 2015-03-31 05:09:35

+0

也许sql开发人员和你的数据库服务器具有不同的'nls_date_format'值。看起来,默认格式在你的sql客户端工作。但是dbms具有不同的导致问题的参数值。 – ntalbs 2015-03-31 06:06:03

+0

哦。好的,谢谢你的解释。 – 2015-03-31 06:14:31

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 
相关问题