sql >> Databasteknik >  >> RDS >> Oracle

4 sätt att ändra tidszonen i Oracle

I Oracle Database kan tidszoner ställas in på olika platser. Nedan finns fyra sätt att ändra tidszonen när du använder Oracle.

Ställ in databasens tidszon

Du kan ställa in databasens tidszon när du skapar databasen. För att göra detta, använd SET TIME_ZONE satsen i CREATE DATABASE uttalande.

Exempel:

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

I det här fallet använde jag ett tidszonsregionsnamn. Se Hur man returnerar en lista med giltiga tidszoner i Oracle Database för att få en fullständig lista över giltiga regionnamn på ditt system.

Alternativt kan du använda en faktisk tidszonförskjutning:

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

Om du inte uttryckligen ställer in tidszonen när du skapar databasen, är den som standard tidszonen för serverns operativsystem.

Du kan också ändra den aktuella tidszonsinställningen för databasen. För att göra detta, använd ALTER DATABASE uttalande.

Exempel:

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

Observera att databasens tidszon endast är relevant för TIMESTAMP WITH LOCAL TIME ZONE kolumner. Oracle rekommenderar också att du ställer in databasens tidszon till UTC (0:00) för att undvika datakonvertering och förbättra prestandan när data överförs mellan databaser.

Ställ in sessionens tidszon

Du kan ställa in sessionens tidszon oberoende av databasens tidszon. När du returnerar TIMESTAMP WITH LOCAL TIME ZONE data, returneras den i den aktuella sessionens tidszon.

Sessionens tidszon träder också i kraft när en TIMESTAMP värdet konverteras till TIMESTAMP WITH TIME ZONE eller TIMESTAMP WITH LOCAL TIME ZONE datatyp.

Du kan göra ett par saker för att ställa in tidszonen på sessionsnivå.

The ORA_SDTZ Miljövariabel

Du kan ställa in sessionens tidszon med ORA_SDTZ miljöfaktor. Detta kan ställas in på följande värden:

  • Operativsystemets lokala tidszon ('OS_TZ' )
  • Databasens tidszon ('DB_TZ' )
  • Absolut offset från UTC (t.ex.'-04:00' )
  • Tidszonens regionnamn (t.ex. 'America/St_Kitts' )

Här är några exempel på hur den här miljövariabeln ställs in i en UNIX-miljö:

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

Standardvärdet för ORA_SDTZ variabeln är 'OD_TZ' . Detta värde används när variabeln inte är inställd eller om den är inställd på ett ogiltigt värde.

ALTER SESSION Uttalande

Du kan ändra tidszonen för en specifik SQL-session med SET TIME_ZONE sats i ALTER SESSION uttalande.

TIME_ZONE kan ställas in på följande värden:

  • Standard lokal tidszon när sessionen startade (local )
  • Databasens tidszon (dbtimezone )
  • Absolut offset från UTC (t.ex. '-04:00' )
  • Tidszonsregionens namn (t.ex. 'Canada/Eastern' )

Här är ett exempel på inställning av TIME_ZONE till sådana värden:

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 kontrollera din nuvarande sessions tidszon med SESSIONTIMEZONE funktion.

Exempel:

SELECT SESSIONTIMEZONE FROM DUAL;

Resultat:

Australia/Brisbane 

I mitt fall är sessionens tidszon inställd på Australien/Brisbane.

AT TIME ZONE Klausul

Ett datetime-uttryck kan innehålla en AT LOCAL sats eller en AT TIME ZONE klausul. Om du inkluderar en AT LOCAL klausul, då returneras resultatet i den aktuella sessionens tidszon. Om du inkluderar AT TIME ZONE klausul, då kan tidszonen vara en av följande:

  • En tidszonsförskjutning
  • Ett tidszonsregionsnamn
  • DBTIMEZONE (denna funktion returnerar tidszonen för databasen)
  • SESSIONTIMEZONE (denna funktion returnerar tidszonen för den aktuella sessionen)
  • Ett uttryck som returnerar en teckensträng med ett giltigt tidszonsformat.

Exempel:

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 det här fallet använde jag FROM_TZ() funktion för att konvertera ett tidsstämpelvärde och en tidszon till en TIMESTAMP WITH TIME ZONE värde. Jag använde sedan AT TIME ZONE klausul för att ange en annan tidszon.

Här är samma exempel, förutom den här gången anger jag 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. Hur man tar reda på när en Oracle-tabell uppdaterades förra gången

  2. MySQL heltalsfält returneras som sträng i PHP

  3. Bättre samtidighet i Oracle än SQL Server?

  4. Hur grupperar jag på kontinuerliga intervall