有兩個問題。
當數據存儲在表中時,日期格式爲dd-mm-rr。
這是完全錯誤的。 Oracle不會以您看到的格式存儲日期,您看到的是display。 Oracle以7 bytes
的內部專有格式存儲DATE,其中每個字節代表DATE的不同元素。
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
不要依賴於locale_specific NLS_DATE_FORMAT。始終使用:
- TO_CHAR到你想要的格式
- TO_DATE顯示日期字符串顯式轉換爲日期。
記住,TO_DATE是NLS依賴。
如果你只有一個日期元素,如果你不計較時間元素,然後更好地利用ANSI日期文字遵循一定的固定格式'YYYY-MM-DD'
。在垃圾字符
僅一個月顯示
這又是因爲你取決於NLS_DATE_LANGUAGE。正如我所說,你應該避免取決於區域設置特定的客戶端設置。明確提及NLS_DATE_LANGUAGE
或使用ANSI日期文字如果您不關心時間元素。
例如,
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
---------
26-OCT-15
SQL> alter session set nls_date_language='french';
Session altered.
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
-----------
26-OCT. -15
那麼,究竟發生了上面?對於一個人使用法國nls_date_language
,MONTH顯示垃圾價值。我們通過明確提及nls_date_language
來讓它成爲NLS獨立。
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR', 'nls_date_language=english') dt FROM DUAL;
DT
---------
26-OCT-15
此外,NLS_LANG值可能無法正確在OS 環境變量設置。請參閱Why are junk values/special characters/question marks displayed on my client?
我們已經在oracle表單中開發用於轉換DD-MM-RR但仍然存在問題的oracle表單中的to_char,但在oracle應用服務器端仍存在問題。 –
@jayeshkamaliya我敢打賭,你依賴於客戶端的'NLS_DATE_LANGUAGE'。查看更新的示例。 –
先生在我們的數據庫nls_language_date是在註冊表中NLS_LANG ameriacan和Oracle應用形式是GUJARATI_INDIA.UTF8這可能是這個問題的原因是什麼? –