Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Domyślny format DATY Oracle

DATE nie ma formatu - jest przechowywany wewnętrznie jako 7 bajtów reprezentujących rok (2 bajty) oraz miesiąc, dzień, godzinę, minutę i sekundę (po 1 bajt).

'25-JAN-18' nie jest datą — jest to literał tekstowy.

Kiedy to zrobisz:

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

Oracle postara się być pomocny i wykonać niejawne rzutowanie z ciągu na datę przy użyciu NLS_DATE_FORMAT parametr sesji użytkownika jako model formatu. Tak więc Twoje oświadczenie zostanie domyślnie przekonwertowane na:

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

Każdy użytkownik może ustawić swoje parametry NLS we własnej sesji (więc powinieneś nigdy) polegać na niejawnej konwersji, ponieważ każdy użytkownik może mieć inne ustawienia dla własnej sesji i zmieniać wartości w trakcie sesji). Zamiast tego powinieneś:

  • Użyj literału daty:

    DATE '2018-01-25'
    
  • Użyj literału znacznika czasu

    TIMESTAMP '2018-01-25 01:23:45'
    
  • Użyj TO_DATE( date_string, format_string [, nls_values] ) i wyraźnie użyj modelu formatu:

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

Jeśli chcesz zmienić NLS_DATE_FORMAT w swojej sesji możesz użyć:

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

Jaki jest domyślny format daty?

Od DATE nie ma formatu, to pytanie nie ma sensu. Zamiast tego, jeśli zapytamy:

Jaki jest domyślny NLS_DATE_FORMAT parametr sesji, którego Oracle używa do konwersji między ciągami a datami?

To zależy od NLS_TERRITORY parametr sesji (więc to zależy od tego, gdzie jesteś na świecie):

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;

Wyświetla format daty i listę terytoriów odpowiadających temu formatowi:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle :wybierz maksymalną wartość z różnych kolumn tego samego wiersza

  2. Kolekcje Oracle PL/SQL — dodawanie elementów do istniejącej tabeli

  3. Funkcja SYSDATE w Oracle

  4. Dlaczego Oracle 9i traktuje pusty ciąg jako NULL?

  5. różnica między klauzulą ​​ON a klauzulą ​​using w sql