PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Risoluzione in millisecondi di DateTime in Ruby

ActiveRecord dovrebbe preservare la piena precisione dal database, semplicemente non lo stai guardando correttamente. Usa strftime e il %N format per vedere i secondi frazionari. Ad esempio, psql dice questo:

=> select created_at from models where id = 1;
         created_at         
----------------------------
 2012-02-07 07:36:20.949641
(1 row)

e ActiveRecord dice questo:

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

Quindi è tutto lì, devi solo sapere come vederlo.

Nota anche che ActiveRecord probabilmente ti darà ActiveSupport::TimeWithZone oggetti anziché DateTime oggetti ma DateTime conserva tutto anche:

> '2012-12-31T01:01:01.232323+3'.to_datetime.strftime('%Y-%m-%d %H:%M:%S.%N')
 => "2012-12-31 01:01:01.232323000" 

Dai un'occhiata a connection_adapters/column.rb nel sorgente ActiveRecord e controlla cosa è il string_to_time metodo fa. La tua stringa scenderebbe nel fallback_string_to_time percorso e che conserva frazioni di secondi il più vicino possibile. Qualcosa di strano potrebbe succedere altrove, non sarei sorpreso date le cose strane che ho visto nel sorgente di Rails, in particolare il lato del database delle cose. Proverei a convertire manualmente le stringhe in oggetti in modo che ActiveRecord tenga le mani lontane da esse.