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

Conversão de fusos horários do Oracle (usando from_tz)


to_timestamp() obtém uma string (VARCHAR2, CHAR ...) se você tentar dar uma data, então o oracle irá convertê-la em uma string de acordo com NLS_DATE_FORMAT que pode variar em diferentes ambientes e retornar resultados inesperados (como neste caso) .
O que você deve fazer é usar to_char primeiro, para que sua consulta fique assim:
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

ATUALIZAÇÃO: se eu entendi direito, então você quer algo assim:
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