有两个问题。
当数据存储在日期格式为 dd-mm-rr 的表中时。
这是完全错误的。Oracle 不会以您看到的格式存储日期,您看到的是用于display。Oracle以内部专有格式存储DATE7 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 Date 文字。
例如,
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
.
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR', 'nls_date_language=english') dt FROM DUAL;
DT
---------
26-OCT-15
此外,操作系统环境变量中的NLS_LANG值可能未正确设置。请参阅为什么在我的客户端上显示垃圾值/特殊字符/问号?