2012-02-13 12 views
6

Estoy tratando de convertir una hora (fecha + hora) de una zona horaria a otra. En la siguiente consulta, intento convertir un tiempo de EST ("America/New_York") a PST ("America/Los_Angeles"). La consulta está funcionando parcialmente; los resultados:Conversión de zonas horarias de Oracle (usando from_tz)

DATABASE_DATE = 2012-02-13 1:00:00 PM 
LOCALTIME (what I get): 2012-02-12 10:00:00 AM. 

Así que el tiempo es bueno, pero la fecha es incorrecta. Debería ser 2012-02-13 en lugar de 2012-02-12.

¿Estoy haciendo algo mal? Aquí está mi consulta:

select to_date(to_char((from_tz(to_timestamp(DATABASE_DATE 
               , 'YYYY-MM-DD HH:MI:SS') 
            ,'America/New_York') 
          at time zone 'America/Los_Angeles') 
         ,'YYYY-MM-DD HH:MI:SS') 
       ,'YYYY-MM-DD HH:MI:SS') as localtime 
from table 

Gracias

+0

¿Intentó agregar "PM" a la cadena de formato? –

+0

Sí, lo he intentado con "PM" y obtengo los mismos resultados. –

+0

solo para estar seguro - DATABASE_DATE es una cadena, no una fecha, ¿verdad? porque, de lo contrario, lo convertirá de acuerdo con nls_timestamp_format, que podría ser 'YYYY-MM-DD HH24: MI: SS' –

Respuesta

6

to_timestamp() Obtiene una cadena (VARCHAR2, CHAR ...) si intenta darle una fecha, a continuación, Oracle se convertirá en una cadena de acuerdo a NLS_DATE_FORMAT que puede variar en diferentes entornos y arrojar resultados inesperados (como en este caso).
Lo que debe hacer es usar to_char en primer lugar, por lo que su consulta puede tener este aspecto:

select to_date(to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York') 
at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM'),'YYYY-MM-DD HH:MI:SS PM') as localtime 
from table 

ACTUALIZACIÓN: si entiendo bien entonces usted quiere algo como esto:

select to_char((from_tz(to_timestamp(to_char(DATABASE_DATE, 'YYYY-MM-DD HH:MI:SS PM'), 'YYYY-MM-DD HH:MI:SS PM') ,'America/New_York') 
    at time zone 'America/Los_Angeles'),'YYYY-MM-DD HH:MI:SS PM TZD') as localtime 
    from table 
+0

Muchas gracias por la explicación y la ayuda con la consulta. Muy apreciado. –

+0

A.B. Cade: Tengo otra pregunta si no te importa. En mi consulta, convierto el tiempo de 'America/New_York' a 'America/Los_Angeles'. También es posible obtener la abreviación de zona horaria ('PST') además de convertir la hora. Entonces, si el tiempo en Nueva York es 2012-02-14 01:00 PM podría obtener 2012-02-14 10:00 AM ** PST ** para Los Ángeles. –

+0

Si entiendo bien, entonces no desea obtener una fecha sino un VARCHAR2 que muestra la fecha formateada e incluye al final la abreviatura. Por lo tanto, debe eliminar la "fecha to_data" superior (ya que no desea una fecha) y agregar al formato to_char "TZD" –

2
SELECT TO_CHAR(NEW_TIME(systimestamp,'EST','PST'), 'DD-MON-YY HH24:MI:SS') AS converted_timestamp_column FROM DUAL; 
Cuestiones relacionadas