2015-01-16 1785 views
0

我想知道除MM,MONTH或MON之外還有其他MONTH格式。 當下面的查詢運行它會給我一個錯誤ORA-01843:不是一個有效的月份,我可以理解爲什麼,因爲服務器從月份「07」中刪除「0」,只留下數字「7」,所以MM格式不是正確的。 但是哪一個呢?ORA-01843:不是有效的月份 - 但是月份格式是? Oracle 11g

select to_char(to_date(START_DATE,'MM/DD/YYYY '), 'DD-MM-YYYY') 
from PER_ALL_PEOPLE_F 
WHERE person_id=12345 

START_DATE列是日期類型,它提供的結果如下所示:2012年7月17日。

+0

Oracle是相當寬容的日期格式,到一個點。它將很高興地接受'7'作爲MM格式模型的一個月。 –

回答

3

你認爲這個月的單位數7是個問題是不正確的;甲骨文通常是相當靈活,會愉快地分析一個單一的數字每月與MM型號:

select to_date('7/17/2012', 'MM/DD/YYYY') from dual; 

TO_DATE('7/17/2012' 
------------------- 
2012-07-17 00:00:00 

如果start_date已經是一個DATE類型,那麼你不應該叫to_date()它。您正在使用NLS_DATE_FORMAT模型向一個字符串進行隱式轉換,然後返回到指定格式的日期。所以,真的是你正在做的:

select to_char(to_date(to_char(START_DATE, <NLS_DATE_FORMAT>), 
    'MM/DD/YYYY '), 'DD-MM-YYYY') 

如果你的NLS_DATE_FORMAT是其他東西比MM/DD/YYYY,例如DD-MON-YYYY,那麼至少有一些值會出現ORA-1843錯誤。

你可以看到這一點:

select to_date(date '2014-01-16', 'MM/DD/YYYY') from dual; 

或擴大:

select to_date(to_char(date '2014-01-16', 'DD-MON-YYYY'), 
    'MM/DD/YYYY') from dual; 

日期沒有任何特定的格式,他們存儲在內部表示,然後轉換成格式化顯示的字符串。你說你的日期顯示爲2012年12月12日,但如果出現錯誤,你會發現你的客戶端似乎是格式化的,並且與會話NLS_DATE_FORMAT沒有關係。

你只需要做:

select to_char(START_DATE, 'DD-MM-YYYY') 
+0

這太好了:select to_char(START_DATE,'DD-MM-YYYY')它很棒!謝謝 :) – Lora

相關問題