2014-04-08 20 views
5

Sto utilizzando una query per ottenere la data di ricezione di un'applicazione dal DB Oracle memorizzata come GMT. Ora devo convertire questo in standard orientale/ora legale durante il recupero. Sto usando la query di seguito per questo:Conversione del fuso orario nella query SQL

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

Funziona bene per il tempo standard. Ma per l'ora legale dobbiamo convertirlo in "edt" in base alle informazioni sul fuso orario. Non sono molto sicuro su come farlo. Please help me

+3

Per quale ** database ** è questo? Non tutti i database che utilizzano SQL supportano lo stesso modo di gestire i fusi orari .... aggiorna i tag con le informazioni appropriate - 'oracle',' sql-server', 'mysql',' postgres' o qualsiasi altra cosa tu stia utilizzando ! –

+0

Mi dispiace, mi sono perso. Aggiornato ora (Oracle) – satyanarayana

risposta

7

È possibile utilizzare questa query, senza doversi preoccupare delle variazioni del fuso orario.

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

Es:

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:

Grazie a Alex Poole per ricordare che, quando fuso orario non è specificato , il fuso orario locale è usato per la conversione.

Per forzare la data da riconoscere come GMT, utilizzare from_tz.

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

Ho seguito i tuoi passi. Ma poi, perché sto ottenendo date differenti d2 e d3 nel codice sottostante 'cast selezionato (data '2014-12-08 'come timestamp) d1, new_time (cast (data '2014-12-08' come timestamp) , 'gmt', 'edt') cast, ( cast (data '2014-12-08 'come data/ora) fuso orario' US/Eastern 'd3 da doppio' D1 ==> 08-DEC-14 12.00. 00.000000000 AM D2 ==> 07-DEC-2014 20:00:00 \t D3 ==> 07-DEC-14 01.30.00.000000000 PM US/EASTERN – satyanarayana

+2

@satyanarayana - 'd2' sta convertendo da GMT a EDT, che è un'ora dopo l'esempio di EatÂPeach perché non dovrebbe essere nell'ora legale a dicembre - usando EST funzionerebbe, ma è più facile e più sicuro usare le regioni. 'd3' sta uscendo dal fuso orario locale, non da GMT. –

+0

@Alex Poole - La ringrazio molto per avermi fatto sapere che stavo convertendo dal fuso orario locale piuttosto che dal GMT. – satyanarayana

1

In Oracle, è possibile raggiungere questo obiettivo con sottostante query:

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

Dove Australia/Sydney è il nome del fuso orario in cui si desidera convertire il vostro tempo.