【问题标题】:oracle date format issueoracle日期格式问题
【发布时间】:2025-12-19 17:55:12
【问题描述】:

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

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

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

希望大家好好指导。

【问题讨论】:

    标签: oracle oracle10g date-formatting nls-lang


    【解决方案1】:

    有两个问题。

    当数据存储在日期格式为 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_DATENLS 相关

    如果你只有一个日期元素,如果你不关心时间元素,那么最好使用 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?

    【讨论】:

    • 我们已经在 oracle 表单中使用 to_char 来转换 DD-MM-RR 但仍然存在问题..在 oracle 应用服务器端。
    • @jayeshkamaliya 我敢打赌,您依赖于客户的NLS_DATE_LANGUAGE。请参阅更新后的示例。
    • sir 在我们的数据库中 nls_language_date 是 ameriacan 而在该注册表中的 oracle 申请表中 nls_lang 是 GUJARATI_INDIA.UTF8 这可能是这个问题的原因吗?
    • @jayeshkamaliya 是的,这将是一个问题。您的客户端操作系统 NLS_LANG 不支持您要显示的字符。见Why are junk values/special characters/question marks displayed on my client?
    • 谢谢先生。但我检查生产数据库都有相同的值。但主要问题是当我们从 Oracle 应用程序服务器端运行表单时,它会给出垃圾字符,而在 Oracle 应用程序服务器端我检查 nls_lang 是 GUJARATI_INDIA.UTF8,所以它可能是垃圾字符的原因。