首页 > 数据库 > mysql教程 > Oracle 中的默认日期格式是什么?为什么不一致?

Oracle 中的默认日期格式是什么?为什么不一致?

DDD
发布: 2025-01-16 16:36:09
原创
924 人浏览过

What's the Default Date Format in Oracle and Why is it Inconsistent?

Oracle 数据库的默认日期格式是什么?

尽管文档中指明了多种默认日期格式,但 Oracle 日期实际上并没有固定的格式。它们以 7 个字节的内部格式存储,分别表示年(2 字节)、月、日、时、分、秒(每个 1 字节)。

为什么会有这么多相互冲突的信息?

这是由于 NLS_DATE_FORMAT 会话参数导致的。该参数作为默认格式,会根据用户的地区设置而有所不同。因此,当用户进行显式字符串到日期的转换或隐式转换时,就会出现格式不一致的情况。 Oracle 在隐式字符串到日期转换时,会尝试根据 NLS_DATE_FORMAT 参数来解释字符串,从而导致不一致性。

推荐实践

为了避免混淆,建议采用以下方法:

  • 日期字面量: DATE '2018-01-25'
  • 时间戳字面量: TIMESTAMP '2018-01-25 01:23:45'
  • 显式 TO_DATE 转换: TO_DATE('25-JUN-18', 'DD-MON-RR')

修改 NLS_DATE_FORMAT

要更改会话中的 NLS_DATE_FORMAT,请使用以下命令:

<code class="language-sql">ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';</code>
登录后复制

NLS_DATE_FORMAT 的默认值

NLS_DATE_FORMAT 的默认值取决于 NLS_TERRITORY 会话参数,该参数表示用户的区域设置。要查看不同地区使用的格式,请运行以下查询:

<code class="language-sql">SET SERVEROUTPUT ON;

VARIABLE cur REFCURSOR;

DECLARE
  territories SYS.ODCIVARCHAR2LIST;
  formats     SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  SELECT value
  BULK COLLECT INTO territories
  FROM v$nls_valid_values
  WHERE parameter = 'TERRITORY'
  ORDER BY value;

  formats.EXTEND(territories.COUNT);
  FOR i IN 1 .. territories.COUNT LOOP
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY='''||territories(i)||'''';

    SELECT value
    INTO formats(i)
    FROM NLS_SESSION_PARAMETERS
    WHERE PARAMETER = 'NLS_DATE_FORMAT';
  END LOOP;

  OPEN :cur FOR
  SELECT f.format AS format,
         LISTAGG(t.territory, ', ') WITHIN GROUP (ORDER BY t.territory) AS territories
  FROM (SELECT ROWNUM AS rn, COLUMN_VALUE AS territory FROM TABLE(territories)) t
         INNER JOIN
         (SELECT ROWNUM AS rn, COLUMN_VALUE AS format FROM TABLE(formats)) f
         ON (f.rn = t.rn)
  GROUP BY f.format;
END;
/

PRINT :cur;</code>
登录后复制

以上是Oracle 中的默认日期格式是什么?为什么不一致?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板