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

Resolução de milissegundos de DateTime em Ruby


ActiveRecord deve preservar a precisão total do banco de dados, você simplesmente não está olhando para ele corretamente. Use strftime e o %N formato para ver os segundos fracionários. Por exemplo, psql diz isso:
=> select created_at from models where id = 1;
         created_at         
----------------------------
 2012-02-07 07:36:20.949641
(1 row)

e ActiveRecord diz isso:
> Model.find(1).created_at.strftime('%Y-%m-%d %H:%M:%S.%N')
 => "2012-02-07 07:36:20.949641000" 

Então tudo está lá, você só precisa saber como vê-lo.

Observe também que o ActiveRecord provavelmente fornecerá ActiveSupport::TimeWithZone objetos em vez de DateTime objetos, mas DateTime preserva tudo também:
> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
 => "2012-12-31 01:01:01.232323000" 

Dê uma olhada em connection_adapters/column.rb na fonte ActiveRecord e verifique o que o string_to_time método faz. Sua string desceria o fallback_string_to_time path e que preserva os segundos fracionários o mais próximo que posso dizer. Algo estranho pode estar acontecendo em outro lugar, eu não ficaria surpreso com as coisas estranhas que vi na fonte do Rails, especialmente o lado do banco de dados. Eu tentaria converter as strings em objetos manualmente para que o ActiveRecord mantenha suas mãos longe delas.