2013-08-23 92 views
1

在我的應用我設置使用下面的命令格式化由程序返回的所有日期的會議NLS_DATE_FORMAT甲骨文NLS_DATE_FORMAT:工作不正常

alter session set nls_date_format='DY DDTH MON YYYY'; 

這應返回的日期是這樣的:「週五23 2013' 年8月

但是,如果我運行下面的查詢:

select SYSDATE from dual; 

我得到以下格式的日期: 'FRI 2013年8月23日'。注意'23'後缺少'rd'。

如果我運行下面的查詢:

select to_char(sysdate, 'DY DDTH MON YYYY') from dual; 

日期不回來所需的格式。那麼爲什麼'TH'日期格式參數在通過NLS_DATE_FORMAT設置時不起作用?是否還有其他日期格式參數在使用TO_CHAR時可以工作,但不能通過NLS_DATE_FORMAT?

感謝您的幫助

順便說一下,我使用Oracle 11.2客戶端和數據庫。

UPDATE

我在SQL Developer中運行了alter session命令。我在SQL PLUS中試過這個,它以正確的格式返回日期。但是,現在我遇到了插入格式化日期的問題。

如果我這樣做(設置NLS_DATE_FORMAT如上)之後,我收到了「ORA-01861的文字不匹配格式字符串」錯誤:

INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18th Apr 2013'); 

我預料到設置NLS_DATE_FORMAT後工作?

如果我改變插入語句:

INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18 Apr 2013'); 

然後它的工作!爲什麼是這樣?

+0

DY DDTH MON YYYY – user1578653

回答

2

如果你這樣做:

alter session set nls_date_format='DD DDTH MON YYYY'; 

你得到一個錯誤,ORA-01810: format code appears twice

如果使用相同的格式模型的TO_CHAR那麼它的工作原理:

alter session set nls_date_format='DY DDTH MON YYYY'; 

Session altered. 

select SYSDATE from dual; 

SYSDATE 
----------------- 
FRI 23RD AUG 2013 

這工作要在SQL Developer和SQL * Plus。


有關將更新後的問題,datetime format documentation說:

Notes on date format element suffixes:

  • When you add one of these suffixes to a datetime format element, the return value is always in English.

  • Datetime suffixes are valid only to format output. You cannot use them to insert a date into the database.

所以你不能使用帶有後綴的字符串作爲你的插件的一部分,無論是顯式或通過NLS_DATE_FORMAT。您將不得不從字符串中刪除它,或者將要處理的格式模型定製爲固定值。

+0

注意:如果OP沒有得到這個錯誤信息,他的應用程序可能沒有做適當的錯誤檢查。 –

+0

對不起,這是我的問題中的一個錯字。我正在做你正在做的以上,我沒有得到適當的日期格式。 – user1578653

+0

謝謝!我沒有看到那些文檔。我想最簡單的解決方案是不允許我的用戶在我的應用程序的日期格式中有後綴! – user1578653

1

您在更改會話陳述中有錯字。設置DY而不是DD放在首位

alter session set nls_date_format='DY DDTH MON YYYY'; 
+0

抱歉,這是我的問題一個錯字,我已經糾正它。 – user1578653

1

您可以將字符串文字'Thu 18th Apr 2013'DATE如下數據類型的列(與雙引號的格式模型封閉th):

INSERT INTO DATE_TABLE (MY_DATE_COL) 
    VALUES (to_date('Thu 18th Apr 2013', 'Dy DD"th" Mon YYYY')); 
+0

但是當我已經設置NLS_DATE_FORMAT時,是否需要使用to_date函數?我認爲如果我將NLS_DATE_FORMAT更改爲DY DDTH MON YYYY並嘗試插入帶有該格式的日期,它應該可以正常工作? – user1578653

+1

@ user1578653 - 您無論如何都隱式使用'to_date'函數,而用NLS_DATE_FORMAT代替第二個參數。在插入過程中,您只能使用後綴,僅用於顯示。當然,在這個模型中,你需要處理'st','nd','rd'以及'th',並且可能是大寫和小寫。 –