【问题标题】:Oracle SQL Query TO_DATEOracle SQL 查询 TO_DATE
【发布时间】:2020-09-02 16:11:15
【问题描述】:

我对 Oracle SQL 中的以下查询有疑问:

SELECT TO_DATE('10-11-2015','DD-MM-YYYY') FROM DUAL;

当我运行它时,结果如下10-NOV-15。根据我在 Oracle 文档中读到的内容,YYYY 应该转换为 4 位数年份,但它会转换为 2 位数年份。为什么会这样?

【问题讨论】:

  • 不是。值就是这样打印的。
  • 函数 to_date 将 STRING 转换为 DATE。然后 Oracle 使用会话的默认格式将此日期转换回字符串:SELECT * FROM nls_session_parameters where PARAMETER = 'NLS_DATE_FORMAT',很可能是DD-MON-YY
  • 存储和显示格式是两个不同的东西。

标签: sql oracle date select oracle12c


【解决方案1】:

您可以通过使用extract() 看到这并没有发生:

SELECT EXTRACT( YEAR FROM TO_DATE('10-11-2015','DD-MM-YYYY') ) FROM DUAL; 

两位数的年份只是价值的呈现方式。

【讨论】:

    【解决方案2】:

    日期设置为 4 位数年份。

    但是,您将使用 Oracle 当前用于在您的用户会话中显示日期的默认格式显示日期。 default format Oracle uses for implicit date conversions 取决于地区。对于美国(除其他外),这是DD-MON-RR,年份为两位数;但对于瑞典,默认值为 RRRR-MM-DD,并且会显示 4 位数的年份。

    可以使用以下方式设置此格式:

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR';
    

    因此,如果您将默认格式设置为 YYYY-MM-DD(ISO-8601 日期格式),则使用:

    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
    

    然后你的查询:

    SELECT TO_DATE('10-11-2015','DD-MM-YYYY') FROM DUAL;
    

    将输出2015-11-10

    如果您想要日期的特定格式,那么您不应该依赖隐式转换,因为 ANY 用户可以在 ANY 时间设置自己的格式,而您不会得到一致的输出;相反,您应该使用显式转换:

    SELECT TO_CHAR( TO_DATE('10-11-2015','DD-MM-YYYY'), 'DD-MM-YYYY' ) FROM DUAL;
    

    将输出10-11-2015

    【讨论】:

      【解决方案3】:

      使用下面的替代方案会更好:

      从 DUAL 中选择 TO_DATE('10-11-2015','DD-MM-RRRR');

      【讨论】:

      • 如何更好?它将产生相同的结果。 RRRRRR 格式掩码是解决千年虫问题的创可贴,但它们只是将问题转移到本世纪中叶,再过几年就会比它的开始更近。 standard date literal 是最安全的格式。
      猜你喜欢
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2015-07-31
      • 2018-06-17
      相关资源
      最近更新 更多