sql >> Base de Datos >  >> RDS >> PostgreSQL

Resolución de milisegundos de DateTime en Ruby

ActiveRecord debería conservar la precisión total de la base de datos, simplemente no la está mirando correctamente. Usar strftime y el %N formato para ver las fracciones de segundo. Por ejemplo, psql dice esto:

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

y ActiveRecord dice esto:

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

Entonces todo está ahí, solo necesitas saber cómo verlo.

También tenga en cuenta que ActiveRecord probablemente le dará ActiveSupport::TimeWithZone objetos en lugar de DateTime objetos pero DateTime conserva todo también:

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

Eche un vistazo a connection_adapters/column.rb en la fuente de ActiveRecord y compruebe qué string_to_time el método lo hace. Su cadena bajaría el fallback_string_to_time ruta y que conserva fracciones de segundo tan cerca como puedo decir. Algo extraño podría estar pasando en otro lugar, no me sorprendería dadas las cosas extrañas que he visto en el código fuente de Rails, especialmente en el lado de la base de datos. Intentaría convertir las cadenas en objetos a mano para que ActiveRecord no los toque.