2

我们使用 Oracle10.2.0.4.0数据库、oracle 表单构建器和报表构建器来创建表单和报表。

现在问题出在我们的生产数据库中 nls_date_format 是 dd-mon-rr 格式。当开发人员在开发人员套装中创建表单时,他们会在表单级别提供 dd-mm-rr 格式,并且当数据存储在表格中时,日期格式为dd-mm-rr.

现在,当开发人员在表单构建器中运行表单或报告时,它会给出 dd-mm-rr 格式。但是当从应用程序服务器端运行相同的表单或报告时,它会在月中给出垃圾字符。日期和年打印与日期格式相同,仅在垃圾中显示月份人物。

希望大家好好指导。

4

1 回答 1

3

有两个问题。

当数据存储在日期格式为 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值可能未正确设置。请参阅为什么在我的客户端上显示垃圾值/特殊字符/问号?

于 2015-10-26T06:50:08.887 回答