Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

data/hora Conversão entre diferentes fusos horários


Primeiro vamos dissolver sua expressão
FROM_TZ(CAST(TO_DATE(TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS'), 'DDMMYYYY:HH24:MI:SS') AS TIMESTAMP), 'Europe/London') AT TIME ZONE 'America/New_York'

faz o seguinte:
  1. TO_CHAR(q.created_date, 'DDMMYYYY:HH24:MI:SS') -> Converter created_date valor para VARCHAR2
  2. TO_DATE(..., 'DDMMYYYY:HH24:MI:SS') -> Converta de volta para um DATE
  3. CAST(... AS TIMESTAMP) -> Converta para um TIMESTAMP (sem fuso horário)
  4. FROM_TZ(..., 'Europe/London') -> Anexar o fuso horário 'Europe/London' a ele
  5. ... AT TIME ZONE 'America/New_York' -> Converter para o fuso horário 'América/Nova_York'

Os pontos 1,2 e 3 são inúteis! Desde created_date é um TIMESTAMP você pode fazê-lo mais curto
TO_CHAR(FROM_TZ(q.created_date, 'Europe/London') AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS')

Caso seu SESSIONTIMEZONE é Europe/London você pode até fazer
TO_CHAR(q.created_date AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI:SS')