我们使用Oracle 10.2.0.4.0
数据库,oracle表单构建器和报表生成器来创建表单和报表。
现在问题出在我们的生产数据库中,nls_date_format是dd-mon-rr格式。当开发人员在开发人员服装中创建表单时,他们在表单级别提供dd-mm-rr格式,并且当数据存储在表格中时,日期格式为dd-mm-rr
。
现在,当开发人员在表单构建器中运行表单或报表时,它会提供dd-mm-rr格式。但是当从应用程序服务器端运行相同的表单或报表时,它会在month.date中提供垃圾字符,并且年份打印与日期格式相同以垃圾字符显示。
希望你们都能很好地指导。
答案 0 :(得分:2)
有两个问题。
当数据存储在表中时,日期格式为dd-mm-rr。
这是完全错误的。 Oracle不会以您看到的格式存储日期,您看到的是显示。 Oracle将{strong> 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_DATE 取决于NLS 。
如果你只有一个日期元素,并且你不关心时间元素,那么最好使用固定格式 {{1}后面的 ANSI Date literal }}
仅在垃圾字符中显示月份
这也是因为您依赖于 NLS_DATE_LANGUAGE 。正如我所说,您应该避免依赖于特定于语言环境的客户端设置。如果您不关心时间元素,请明确提及'YYYY-MM-DD'
或使用 ANSI Date literal 。
例如,
NLS_DATE_LANGUAGE
那么,上面发生了什么?对于使用 FRENCH 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
的人, MONTH 会显示垃圾值。让我们通过明确提到nls_date_language
来使其独立于NLS。
nls_date_language
此外,可能无法在OS 环境变量中正确设置 NLS_LANG 值。见Why are junk values/special characters/question marks displayed on my client?