2015-03-31 61 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 
相關問題