Oracle データベースのデフォルトの日付形式は何ですか?
ドキュメントではさまざまなデフォルトの日付形式が指定されていますが、実際には Oracle の日付に固定された形式はありません。これらは、年 (2 バイト)、月、日、時、分、秒 (それぞれ 1 バイト) を表す 7 バイトの内部形式で保存されます。
なぜこれほど矛盾した情報が存在するのでしょうか?
これは、NLS_DATE_FORMAT セッション パラメータが原因です。このパラメータはデフォルトの形式として機能し、ユーザーの地域設定によって異なります。したがって、ユーザーが文字列から日付への明示的な変換または暗黙的な変換を実行すると、形式の不一致が発生する可能性があります。 Oracle は、暗黙的な文字列から日付への変換中に、NLS_DATE_FORMAT パラメータに基づいて文字列を解釈しようとするため、不整合が発生します。
推奨される実践方法
混乱を避けるために、次のアプローチをお勧めします:
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 サイトの他の関連記事を参照してください。