Heim >Datenbank >MySQL-Tutorial >Was ist das Standarddatumsformat in Oracle und warum ist es inkonsistent?

Was ist das Standarddatumsformat in Oracle und warum ist es inkonsistent?

DDD
DDDOriginal
2025-01-16 16:36:09929Durchsuche

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

Was ist das Standarddatumsformat in der Oracle-Datenbank?

Obwohl in der Dokumentation verschiedene Standard-Datumsformate angegeben sind, gibt es tatsächlich kein festes Format für Oracle-Datumsangaben. Sie werden in einem internen 7-Byte-Format gespeichert und stellen das Jahr (2 Byte), den Monat, den Tag, die Stunde, die Minute und die Sekunde (jeweils 1 Byte) dar.

Warum gibt es so viele widersprüchliche Informationen?

Dies liegt am Sitzungsparameter NLS_DATE_FORMAT. Dieser Parameter dient als Standardformat und variiert je nach den regionalen Einstellungen des Benutzers. Daher können Formatinkonsistenzen auftreten, wenn Benutzer explizite Konvertierungen von Zeichenfolgen in Datumswerte oder implizite Konvertierungen durchführen. Bei der impliziten Konvertierung von Zeichenfolgen in Datum versucht Oracle, die Zeichenfolge basierend auf dem Parameter NLS_DATE_FORMAT zu interpretieren, was zu Inkonsistenzen führt.

Empfohlene Vorgehensweisen

Um Verwirrung zu vermeiden, wird folgende Vorgehensweise empfohlen:

  • Datumsliteral:DATUM '25.01.2018'
  • Zeitstempel-Literal: TIMESTAMP '2018-01-25 01:23:45'
  • Explizite TO_DATE-Konvertierung: TO_DATE('25-JUN-18', 'DD-MON-RR')

NLS_DATE_FORMAT ändern

Um das NLS_DATE_FORMAT in einer Sitzung zu ändern, verwenden Sie den folgenden Befehl:

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

Standardwert von NLS_DATE_FORMAT

Der Standardwert von NLS_DATE_FORMAT hängt vom Sitzungsparameter NLS_TERRITORY ab, der das Gebietsschema des Benutzers darstellt. Um zu sehen, welche Formate in verschiedenen Regionen verwendet werden, führen Sie die folgende Abfrage aus:

<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>

Das obige ist der detaillierte Inhalt vonWas ist das Standarddatumsformat in Oracle und warum ist es inkonsistent?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn