2014-04-08 18 views
5

Ich verwende eine Abfrage, um einige Anwendung erhalten Datum von Oracle DB, die als GMT gespeichert ist. Jetzt muss ich dies beim Abrufen in Oststandard/Sommerzeit umrechnen. Ich bin mit der folgenden Abfrage für diesen:Zeitzone Konvertierung in SQL-Abfrage

select to_char (new_time(application_recv_date,'gmt','est'), 'MON dd, YYYY') from application 

Es ist für Standard-Zeit funktioniert. Aber für die Sommerzeit müssen wir sie basierend auf Zeitzoneninformationen in 'edt' umwandeln. Ich bin mir nicht sicher, wie ich das machen soll. Bitte helfen Sie mir

+3

Für was ** Datenbank ** ist das? Nicht alle Datenbanken, die SQL verwenden, unterstützen den gleichen Umgang mit Zeitzonen .... bitte aktualisieren Sie Ihre Tags mit den entsprechenden Informationen - 'oracle',' sql-server', 'mysql',' postgres' oder was auch immer Sie verwenden ! –

+0

Entschuldigen Sie es verpaßt..Updated jetzt (Oracle) – satyanarayana

Antwort

7

Sie können diese Abfrage verwenden, ohne sich um Zeitzonenänderungen kümmern zu müssen.

select to_char(cast(application_recv_date as timestamp) at time zone 'US/Eastern', 
       'MON dd, YYYY' 
      ) 
from application; 

Ex:

EDT:

select cast(date'2014-04-08' as timestamp) d1, 
     cast(date'2014-04-08' as timestamp) at time zone 'US/Eastern' d2 
from dual; 

D1         D2 
---------------------------------- ------------------------------------------- 
08-APR-14 12.00.00.000000 AM  07-APR-14 08.00.00.000000 PM US/EASTERN 

EST:

select cast(date'2014-12-08' as timestamp) d1, 
     cast(date'2014-12-08' as timestamp) at time zone 'US/Eastern' d2 
from dual; 

D1         D2 
---------------------------------- ------------------------------------------- 
08-DEC-14 12.00.00.000000 AM  07-DEC-14 07.00.00.000000 PM US/EASTERN 

UPDATE:

Dank Alex Poole daran erinnert, dass, wenn Zeitzone nicht angegeben , lokale Zeitzone ist zur Konvertierung verwendet.

Um zu erzwingen, dass das Datum als GMT erkannt wird, verwenden Sie from_tz.

from_tz(cast(date'2014-12-08' as timestamp), 'GMT') at time zone 'US/Eastern' 
+0

Ich folgte Ihren Schritten. Aber dann, warum ich verschiedene Daten d2 & d3 im folgenden Code bekomme 'wählen Besetzung (Datum'2014-12-08 'als Zeitstempel) d1, new_time (Besetzung (Datum'2014-12-08' als Zeitstempel) , 'gmt', 'edt') d2, Besetzung (Datum'2014-12-08 'als Zeitstempel) in Zeitzone' US/Eastern 'd3 von Dual' D1 ==> 08-DEC-14 12.00. 00.000000000 AM D2 ==> 07-DEC-2014 20:00:00 D3 ==> 07-DEC-14 01.30.00.000000000 PM US/EASTERN – satyanarayana

+2

@satyanarayana - 'd2' konvertiert von GMT zu EDT, was ist eine Stunde vom Beispiel von EatPeach entfernt, da es im Dezember keine Sommerzeiteinsparungen geben sollte - die Verwendung von EST würde funktionieren, aber es ist einfacher und sicherer, Regionen zu nutzen. 'd3' konvertiert von Ihrer lokalen Zeitzone, nicht von GMT. –

+0

@Alex Poole - Vielen Dank, dass Sie mir mitgeteilt haben, dass ich von der lokalen Zeitzone anstatt von GMT konvertiert habe. – satyanarayana

1

In Oracle, können Sie dies erreichen mit folgenden Abfrage:

Select current_timestamp, current_timestamp at time zone 'Australia/Sydney' from dual; 

Wo Australia/Sydney den Namen Ihrer Zeitzone, in der Sie Ihre Zeit konvertieren möchten.