ホームページ >データベース >mysql チュートリアル >Oracle のデフォルトの日付形式とは何ですか? それが一貫性がないのはなぜですか?

Oracle のデフォルトの日付形式とは何ですか? それが一貫性がないのはなぜですか?

DDD
DDDオリジナル
2025-01-16 16:36:09926ブラウズ

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

Oracle データベースのデフォルトの日付形式は何ですか?

ドキュメントではさまざまなデフォルトの日付形式が指定されていますが、実際には Oracle の日付に固定された形式はありません。これらは、年 (2 バイト)、月、日、時、分、秒 (それぞれ 1 バイト) を表す 7 バイトの内部形式で保存されます。

なぜこれほど矛盾した情報が存在するのでしょうか?

これは、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。