oracle日期格式问题

时间:2015-10-26 06:43:11

标签: oracle oracle10g date-formatting nls-lang

我们使用Oracle 10.2.0.4.0数据库,oracle表单构建器和报表生成器来创建表单和报表。

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

现在,当开发人员在表单构建器中运行表单或报表时,它会提供dd-mm-rr格式。但是当从应用程序服务器端运行相同的表单或报表时,它会在month.date中提供垃圾字符,并且年份打印与日期格式相同以垃圾字符显示。

希望你们都能很好地指导。

1 个答案:

答案 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_CHAR 以所需格式显示日期
  • TO_DATE 将字符串显式转换为日期。

请注意, 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?