PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como converter string em timestamp sem fuso horário


Representação de string de um timestamp (=timestamp without time zone ) depende de suas configurações de localidade. Portanto, para evitar ambiguidades que levem a erros de dados ou o Postgres tossindo uma exceção, você tem duas opções:

1.) Use o formato ISO 8601 , que funciona da mesma forma com qualquer locale ou DateStyle contexto:
'2013-08-20 14:52:49'

Você pode ter que converter o literal de string explicitamente onde o tipo de dados não pode ser derivado do contexto, dependendo do caso de uso:
'2013-08-20 14:52:49'::timestamp

2.) Converta a string para timestamp usando to_timestamp() com um padrão de modelo correspondente:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')

Isso retorna timestamptz , assumindo a configuração de fuso horário atual. Normalmente (como em uma atribuição) o tipo é coagido de acordo. Para timestamp , isso significa que o deslocamento de tempo é truncado e você obtém o valor esperado. Novamente, se o tipo de destino não puder ser derivado do contexto, talvez seja necessário converter explicitamente:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp

Como isso simplesmente remove o deslocamento de tempo, resulta no valor esperado. Ou use o AT TIME ZONE construa com um fuso horário de sua escolha:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'

Embora o fuso horário de destino seja o mesmo do seu timezone atual configuração, nenhuma transformação ocorre. Caso contrário, o carimbo de data/hora resultante é transposto de acordo. Leitura adicional:
  • Ignorando completamente os fusos horários no Rails e no PostgreSQL