sql >> Database teknologi >  >> RDS >> Oracle

Sådan ændres datoformatet i din Oracle-session

Når du arbejder med funktioner, der returnerer datoer, returnerer Oracle Database disse datoer baseret på værdien af ​​NLS_DATE_FORMAT parameter.

Der er også en NLS_TIMESTAMP_FORMAT parameter og en NLS_TIMESTAMP_TZ_FORMAT parameter, som begge har en datetime-formatmaske, der kan specificeres separat.

Alle disse parametre har deres standardværdier afledt af NLS_TERRITORY parameter (som som standard er operativsystemafhængig).

Så for at ændre datoformatet for din session kan du enten opdatere NLS_TERRITORY parameter, eller eksplicit opdatere hver parameter individuelt.

Denne artikel giver eksempler på kontrol og ændring af disse værdier og visning af resultaterne.

Tjek den oprindelige indstilling

Lad os først tjekke min nuværende indstilling for NLS_DATE_FORMAT parameter:

SELECT
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
    'NLS_TERRITORY',
    'NLS_DATE_FORMAT',
    'NLS_TIMESTAMP_FORMAT',
    'NLS_TIMESTAMP_TZ_FORMAT'
    ); 

Resultat:

 PARAMETERVÆRDI __________________________ ________________________________ NLS_TERRITORY AUSTRALIA NLS_DATE_FORMAT DD/MON/RR NLS_TIMESTAMP_FORMAT DD/MON/RR HH12:MI:SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD/MON/RR HH12:MI:SSXFF AM TZ:SSXFF AM 

Værdien af ​​min NLS_TERRITORY parameteren er AUSTRALIA , og så bruger de forskellige datetime-parametre standardformatmodellen for Australien.

Denne værdi påvirker, hvordan datoen formateres, når vi bruger visse funktioner. For eksempel, her er et eksempel på brug af SYSDATE for at returnere den aktuelle dato:

SELECT SYSDATE
FROM DUAL; 

Resultat:

04/AUG/21

Skift indstillingen

Vi kan bruge ALTER SESSION sætning for at ændre indstillingen for disse parametre.

Vi har mulighed for at ændre hver af disse parametre individuelt eller ændre NLS_TERRITORY parameter, som automatisk opdaterer hver af disse parametre implicit.

Skift NLS_TERRITORY Parameter

Her er et eksempel på ændring af NLS_TERRITORY parameter:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA'; 

Resultat:

Session ændret.

Lad os tjekke de nye værdier:

SELECT
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
    'NLS_TERRITORY',
    'NLS_DATE_FORMAT',
    'NLS_TIMESTAMP_FORMAT',
    'NLS_TIMESTAMP_TZ_FORMAT'
    ); 

Resultat:

 PARAMETERVÆRDI __________________________ _______________________________ NLS_TERRITORY AMERICA NLS_DATE_FORMAT DD-MON-RR NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 

Så vi kan se, at ikke kun territoriet er blevet opdateret, de forskellige datetime-parametre er også blevet opdateret.

Skift bare NLS_DATE_FORMAT Parameter

Her er et eksempel på opdatering af NLS_DATE_FORMAT parameter:

ALTER SESSION SET NLS_DATE_FORMAT = 'rr-mm-dd'; 

Resultat:

Session ændret.

Lad os tjekke den nye værdi:

SELECT
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
    'NLS_TERRITORY',
    'NLS_DATE_FORMAT',
    'NLS_TIMESTAMP_FORMAT',
    'NLS_TIMESTAMP_TZ_FORMAT'
    ); 

Resultat:

 PARAMETERVÆRDI __________________________ _______________________________ NLS_TERRITORY AMERICA NLS_DATE_FORMAT rr-mm-dd NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 

Som forventet kun NLS_DATE_FORMAT parameter er blevet ændret til det nye format. De øvrige forbliver uændrede.

Nu når vi kører SYSDATE , datoen returneres i vores nye format, men SYSTIMESTAMP returnerer den ved hjælp af NLS_TIMESTAMP_TZ_FORMAT format, som er uændret:

SELECT 
    SYSDATE,
    SYSTIMESTAMP
FROM DUAL; 

Resultat:

 SYSDATE SYSTIMESTAMP ___________ __________________________________________ 21-08-09 09-AUG-21 07.22.35.402453000 PM -04:00 

  1. Henter Lås ventetimeout overskredet; prøv at genstarte transaktionen, selvom jeg ikke bruger en transaktion

  2. Fatal fejl:Kald til udefineret funktion session_register()

  3. Sådan ændres kolonnestørrelse i MySQL

  4. Konvertering mellem dato- og klokkeslætsdatatyper i SQL Server (T-SQL-eksempler)