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

4 måder at ændre tidszonen i Oracle

I Oracle Database kan tidszoner indstilles forskellige steder. Nedenfor er fire måder at ændre tidszonen på, når du bruger Oracle.

Indstil databasens tidszone

Du kan indstille databasens tidszone, når du opretter databasen. For at gøre dette skal du bruge SET TIME_ZONE klausul i CREATE DATABASE erklæring.

Eksempel:

CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';

I dette tilfælde brugte jeg et tidszoneområdenavn. Se, hvordan du returnerer en liste over gyldige tidszoner i Oracle-databasen for at få en komplet liste over gyldige regionsnavne på dit system.

Alternativt kan du bruge en faktisk tidszoneforskydning:

CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';

Hvis du ikke udtrykkeligt angiver tidszonen, når du opretter databasen, vil den som standard være tidszonen for serverens operativsystem.

Du kan også ændre den aktuelle tidszoneindstilling for databasen. For at gøre dette skal du bruge ALTER DATABASE erklæring.

Eksempel:

ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';

Bemærk, at databasens tidszone kun er relevant for TIMESTAMP WITH LOCAL TIME ZONE kolonner. Oracle anbefaler også, at du indstiller databasens tidszone til UTC (0:00) for at undgå datakonvertering og forbedre ydeevnen, når data overføres mellem databaser.

Indstil sessionens tidszone

Du kan indstille sessionens tidszone uafhængigt af databasens tidszone. Når du returnerer TIMESTAMP WITH LOCAL TIME ZONE data, returneres det i den aktuelle sessions tidszone.

Sessionens tidszone træder også i kraft, når en TIMESTAMP værdien konverteres til TIMESTAMP WITH TIME ZONE eller TIMESTAMP WITH LOCAL TIME ZONE datatype.

Du kan gøre et par ting for at indstille tidszonen på sessionsniveau.

Than ORA_SDTZ Miljøvariabel

Du kan indstille sessionens tidszone med ORA_SDTZ miljøvariabel. Dette kan indstilles til følgende værdier:

  • Operativsystemets lokale tidszone ('OS_TZ' )
  • Databasens tidszone ('DB_TZ' )
  • Absolut offset fra UTC (f.eks.'-04:00' )
  • Tidszoneregionsnavn (f.eks. 'America/St_Kitts' )

Her er nogle eksempler på indstilling af denne miljøvariabel i et UNIX-miljø:

% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'

Standardværdien for ORA_SDTZ variabel er 'OD_TZ' . Denne værdi bruges, når variablen ikke er indstillet, eller den er indstillet til en ugyldig værdi.

ALTER SESSION Erklæring

Du kan ændre tidszonen for en specifik SQL-session med SET TIME_ZONE klausul i ALTER SESSION erklæring.

TIME_ZONE kan indstilles til følgende værdier:

  • Standard lokal tidszone, da sessionen blev startet (local )
  • Databasens tidszone (dbtimezone )
  • Absolut offset fra UTC (f.eks. '-04:00' )
  • Tidszoneregionsnavn (f.eks. 'Canada/Eastern' )

Her er et eksempel på indstilling af TIME_ZONE til sådanne værdier:

ALTER SESSION SET TIME_ZONE=local;
ALTER SESSION SET TIME_ZONE=dbtimezone;
ALTER SESSION SET TIME_ZONE='Canada/Eastern';
ALTER SESSION SET TIME_ZONE='-04:00';

Du kan tjekke din aktuelle sessions tidszone med SESSIONTIMEZONE funktion.

Eksempel:

SELECT SESSIONTIMEZONE FROM DUAL;

Resultat:

Australia/Brisbane 

I mit tilfælde er sessionens tidszone indstillet til Australien/Brisbane.

AT TIME ZONE Klausul

Et datetime-udtryk kan indeholde en AT LOCAL klausul eller en AT TIME ZONE klausul. Hvis du inkluderer en AT LOCAL klausul, så returneres resultatet i den aktuelle sessions tidszone. Hvis du inkluderer AT TIME ZONE klausul, så kan tidszonen være en af ​​følgende:

  • En tidszoneforskydning
  • Et tidszoneområdenavn
  • DBTIMEZONE (denne funktion returnerer databasens tidszone)
  • SESSIONTIMEZONE (denne funktion returnerer tidszonen for den aktuelle session)
  • Et udtryk, der returnerer en tegnstreng med et gyldigt tidszoneformat.

Eksempel:

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00') 
    AT TIME ZONE '+12:00'
FROM DUAL;

Resultat:

02/JAN/30 04:30:35.000000000 AM +12:00

I dette tilfælde brugte jeg FROM_TZ() funktion til at konvertere en tidsstempelværdi og en tidszone til et TIMESTAMP WITH TIME ZONE værdi. Jeg brugte derefter AT TIME ZONE klausul for at angive en anden tidszone.

Her er det samme eksempel, bortset fra at denne gang angiver jeg AT LOCAL :

SELECT 
    FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00') 
    AT LOCAL
FROM DUAL;

Resultat:

02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE

  1. oracle sql-forespørgsel for at vise alle datoerne for den foregående måned

  2. Sikkerhedskopier/gendan en dockeriseret PostgreSQL-database

  3. Brug af Docker på Azure Container Service med Swarm Cluster

  4. SQL-forespørgsel for at få kolonneværdier, der svarer til MAX-værdien i en anden kolonne?