Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Format TANGGAL default Oracle

DATE tidak memiliki format - disimpan secara internal sebagai 7-byte yang mewakili tahun (2 byte) dan bulan, hari, jam, menit dan detik (masing-masing 1 byte).

'25-JAN-18' bukan tanggal - ini adalah teks literal.

Ketika Anda melakukannya:

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

Oracle akan mencoba membantu dan melakukan pemeran implisit dari string ke tanggal menggunakan NLS_DATE_FORMAT parameter untuk sesi pengguna sebagai model format. Jadi, pernyataan Anda akan secara implisit dikonversi menjadi:

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

Setiap pengguna dapat mengatur parameter NLS mereka di sesi mereka sendiri (jadi Anda harus tidak pernah mengandalkan konversi implisit karena setiap pengguna dapat memiliki pengaturan yang berbeda untuk sesi mereka sendiri dan dapat mengubah nilai di tengah sesi). Sebaliknya, Anda harus:

  • Gunakan literal Tanggal:

    DATE '2018-01-25'
    
  • Gunakan literal Timestamp

    TIMESTAMP '2018-01-25 01:23:45'
    
  • Gunakan TO_DATE( date_string, format_string [, nls_values] ) dan secara eksplisit menggunakan model format:

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

Jika Anda ingin mengubah NLS_DATE_FORMAT di sesi Anda maka Anda dapat menggunakan:

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

Apa format tanggal default?

Sejak DATE tidak memiliki format, pertanyaan ini tidak masuk akal. Sebaliknya jika kita bertanya:

Apa NLS_DATE_FORMAT defaultnya? parameter sesi yang digunakan Oracle untuk mengonversi antara string dan tanggal?

Itu tergantung pada NLS_TERRITORY parameter sesi (jadi tergantung di mana Anda berada di dunia):

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;

Menampilkan format tanggal dan daftar wilayah yang sesuai dengan format tersebut:

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. Indeks Oracle dan jenis indeks di Oracle dengan contoh

  2. SQL tidak mengenali alias kolom di mana klausa

  3. Apa perbedaan utama antara Varchar2 dan char

  4. Kesalahan SQL:ORA-02291:batasan integritas

  5. Oracle - Cara menghasilkan skrip dari pengembang sql