sql >> Databasteknik >  >> RDS >> PostgreSQL

Millisekundens upplösning av DateTime i Ruby

ActiveRecord bör bevara hela precisionen från databasen, du tittar bara inte på den ordentligt. Använd strftime och %N formatera för att se bråkdelssekunderna. Till exempel, psql säger så här:

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

och ActiveRecord säger detta:

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

Så allt finns där, du behöver bara veta hur du ser det.

Observera också att ActiveRecord förmodligen kommer att ge dig ActiveSupport::TimeWithZone objekt istället för DateTime objekt men DateTime bevarar allt också:

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

Ta en titt på connection_adapters/column.rb i ActiveRecord-källan och kontrollera vilken string_to_time metoden gör. Din sträng skulle gå ned fallback_string_to_time väg och det bevarar bråkdelar av sekunder så nära jag kan säga. Något konstigt kan hända någon annanstans, jag skulle inte bli förvånad med tanke på de konstiga saker jag har sett i Rails-källan, särskilt databassidan av saker. Jag skulle försöka konvertera strängarna till objekt för hand så att ActiveRecord håller händerna borta från dem.



  1. Använder Hibernates ScrollableResults för att långsamt läsa 90 miljoner poster

  2. Rails 4 LIKE-fråga - ActiveRecord lägger till citat

  3. Varför returnerar IS NOT NULL NULL-värden för en Varchar(max) i SQL Server?

  4. Sömnfunktion i ORACLE