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