Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Das standardmäßige DATE-Format von Oracle

Ein DATE hat kein Format - es wird intern als 7-Bytes gespeichert, die Jahr (2 Bytes) und Monat, Tag, Stunde, Minute und Sekunde (jeweils 1 Byte) darstellen.

'25-JAN-18' ist kein Datum - es ist ein Textliteral.

Wenn Sie dies tun:

INSERT INTO table_name ( date_column ) VALUES ( '25-JAN-18' );

Oracle wird versuchen, hilfreich zu sein und mithilfe von NLS_DATE_FORMAT eine implizite Umwandlung von einer Zeichenfolge in ein Datum durchführen Parameter für die Sitzung des Benutzers als Formatmodell. Ihre Anweisung wird also implizit umgewandelt in:

INSERT INTO table_name ( date_column ) VALUES (
  TO_DATE(
    '25-JAN-18',
    ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
  )
);

Jeder Benutzer kann seine NLS-Parameter in seiner eigenen Sitzung festlegen (also sollten Sie niemals Verlassen Sie sich auf die implizite Konvertierung, da jeder Benutzer unterschiedliche Einstellungen für seine eigene Sitzung haben und die Werte während der Sitzung ändern kann). Stattdessen sollten Sie:

  • Verwenden Sie ein Datumsliteral:

    DATE '2018-01-25'
    
  • Verwenden Sie ein Timestamp-Literal

    TIMESTAMP '2018-01-25 01:23:45'
    
  • Verwenden Sie TO_DATE( date_string, format_string [, nls_values] ) und explizit ein Formatmodell verwenden:

    TO_DATE( '25-JUN-18', 'DD-MON-RR' )
    

Wenn Sie das NLS_DATE_FORMAT ändern möchten In Ihrer Sitzung können Sie dann Folgendes verwenden:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

Was ist das Standard-Datumsformat?

Seit einem DATE kein Format hat, ergibt diese Frage keinen Sinn. Stattdessen, wenn wir fragen:

Was ist das Standard-NLS_DATE_FORMAT Sitzungsparameter, den Oracle verwendet, um zwischen Zeichenfolgen und Daten zu konvertieren?

Es hängt vom NLS_TERRITORY ab Sitzungsparameter (es hängt also davon ab, wo Sie sich auf der Welt befinden):

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 CAST( f.format AS VARCHAR2(12) ) 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;

Gibt das Datumsformat und die Liste der Gebiete aus, die diesem Format entsprechen:

FORMAT       TERRITORIES
------------ ------------------------------------------------------------------
DD MON RRRR  THAILAND
DD-MM-RR     ALGERIA, BAHRAIN, INDIA, MOROCCO, THE NETHERLANDS, TUNISIA
DD-MM-RRRR   BANGLADESH, INDONESIA, ROMANIA, VIETNAM
DD-MON-RR    AMERICA, CHINA, HONG KONG, IRELAND, ITALY, PAKISTAN, TAIWAN,
             UNITED KINGDOM
DD-MON-RRRR  ISRAEL
DD.MM.RR     AUSTRIA, BELARUS, CIS, CROATIA, CZECH REPUBLIC, CZECHOSLOVAKIA,
             GERMANY, RUSSIA, SLOVAKIA, SLOVENIA, SWITZERLAND
DD.MM.RRRR   ALBANIA, AZERBAIJAN, ESTONIA, FINLAND, FYR MACEDONIA, ICELAND,
             KAZAKHSTAN, MACEDONIA, NORWAY, SERBIA AND MONTENEGRO, UKRAINE,
             YUGOSLAVIA
DD.MM.RRRR.  MONTENEGRO, SERBIA
DD.fmMM.RRRR ARMENIA
DD/MM/RR     AFGHANISTAN, BELGIUM, BRAZIL, CAMEROON, CATALONIA, CHILE, COLOMBIA,
             CONGO BRAZZAVILLE, CONGO KINSHASA, COSTA RICA, CYPRUS, DJIBOUTI,
             EGYPT, EL SALVADOR, FRANCE, GABON, GREECE, GUATEMALA, HONDURAS,
             IRAQ, IVORY COAST, JORDAN, KUWAIT, LEBANON, LIBYA, LUXEMBOURG,
             MAURITANIA, MEXICO, NEW ZEALAND, NICARAGUA, OMAN, PANAMA, PERU,
             PUERTO RICO, QATAR, SAUDI ARABIA, SINGAPORE, SOMALIA, SPAIN, SUDAN,
             SYRIA, UNITED ARAB EMIRATES, URUGUAY, VENEZUELA, YEMEN
DD/MM/RRRR   ARGENTINA, BAHAMAS, BERMUDA, ECUADOR, MALAYSIA, SENEGAL, TURKEY,
             UGANDA, ZAMBIA
DD/MON/RR    AUSTRALIA, SOUTH AFRICA, UZBEKISTAN
DD/fmMM/RRRR LAOS, NIGERIA
MM/DD/RRRR   PHILIPPINES
RR-MM-DD     CANADA, DENMARK, JAPAN
RR-MON-DD    HUNGARY
RR.MM.DD     PORTUGAL
RR/MM/DD     KOREA, POLAND
RRRR-MM-DD   BULGARIA, SWEDEN
RRRR-fmMM-DD CAMBODIA
RRRR.MM.DD   LATVIA, LITHUANIA
RRRR/fmMM/fm IRAN, SRI LANKA
fmDD-MM-RR   BOLIVIA
fmDD/MM/RR   PARAGUAY
fmDD/MM/RRRR BELIZE, ETHIOPIA, MALTA, NEPAL
fmDD/fmMM/RR MALDIVES
fmMM.DD.RRRR BOSNIA AND HERZEGOVINA
fmMM/DD/RRRR KENYA, TANZANIA