有两个问题。
当数据存储在日期格式为 dd-mm-rr 的表中时。
这是完全错误的。 Oracle 不会以您看到的格式存储日期,您看到的是 display。 Oracle 以内部专有格式将 DATE 存储在 7 bytes 中,每个字节代表 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
那么,上面发生了什么?对于使用 FRENCH 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 值可能未在操作系统环境变量中正确设置。见Why are junk values/special characters/question marks displayed on my client?