sql >> Database >  >> RDS >> Oracle

Oracle's standaard DATE-indeling

Een DATE heeft geen formaat - het wordt intern opgeslagen als 7-bytes die jaar (2 bytes) en maand, dag, uur, minuut en seconde vertegenwoordigen (elk 1 byte).

'25-JAN-18' is geen datum - het is letterlijk een tekst.

Wanneer je dat doet:

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

Oracle zal proberen behulpzaam te zijn en een impliciete cast van een string naar een datum uit te voeren met behulp van de NLS_DATE_FORMAT parameter voor de sessie van de gebruiker als het formaatmodel. Uw verklaring wordt dus impliciet omgezet in:

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

Elke gebruiker kan zijn NLS-parameters in zijn eigen sessie instellen (dus u moet nooit vertrouwen op impliciete conversie, aangezien elke gebruiker verschillende instellingen voor zijn eigen sessie kan hebben en de waarden halverwege de sessie kan wijzigen). In plaats daarvan moet je:

  • Gebruik een letterlijke datum:

    DATE '2018-01-25'
    
  • Gebruik letterlijk een tijdstempel

    TIMESTAMP '2018-01-25 01:23:45'
    
  • Gebruik TO_DATE( date_string, format_string [, nls_values] ) en gebruik expliciet een formaatmodel:

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

Als u de NLS_DATE_FORMAT . wilt wijzigen in uw sessie kunt u het volgende gebruiken:

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

Wat is de standaard datumnotatie?

Sinds een DATE geen formaat heeft, is deze vraag niet logisch. In plaats daarvan, als we vragen:

Wat is de standaard NLS_DATE_FORMAT sessieparameter die Oracle gebruikt om te converteren tussen strings en datums?

Het hangt af van de NLS_TERRITORY sessieparameter (het hangt er dus van af waar ter wereld u zich bevindt):

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;

Voert het datumformaat en de lijst met territoria die overeenkomen met dat formaat uit:

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. Geautomatiseerd testen van het upgradeproces voor PXC/MariaDB Galera Cluster

  2. CURRENT_DATE/CURDATE() werkt niet als standaard DATE-waarde

  3. Hoe NIET REGEXP werkt in MySQL

  4. SQL Server datetime LIKE selecteren?