2013-05-28 11 views
5

私はrails apiとiOSクライアントを使用しているプロジェクトで作業していますが、updated_atフィールドを参照として使用して、最後にクライアントから引き出します。ActiveRecord:where句を使用するとミリ秒が考慮されない

updated_atの日時は

Model.updated_at.to_f 

する "1368977381.063427" のようなものを返すことを意味し、ミリ秒単位の精度を持っています。 これは「2013-05-19T15:29:41.063427000Z」という形式でクライアントに送信されます。

問題は、その日時をクライアントから取得して構文解析してクエリすると、ミリ秒が失われることです。私は何を取得してはならないとき、ミリ秒は切り捨てられますので

last_update = DateTime.strptime("2013-05-19T15:29:41.063427000Z", "%Y-%m-%dT%H:%M:%S.%N%z") 
Model.where("updated_at > ?", last_update) 

が結果

last_update = DateTime.strptime("2013-05-19T15:29:41Z", "%Y-%m-%dT%H:%M:%S%z") 
Model.where("updated_at > ?", last_update) 

をやってと同じくらい良いですが、私は常に、少なくとも1つの結果を取得します。

私はどのようにそれらを考慮に入れることができますか?

答えて

5

あなたはまた、(initiallizerにすなわち)を設定することにより、データベース内のDateTimeのための標準フォーマットとしてこのフォーマットを設定することができ

Model.where("updated_at > ?", last_update.strftime("%Y-%m-%dT%H:%M:%S.%N%z")) 

をお試しください:

Time::DATE_FORMATS[:db]= '%Y-%m-%dT%H:%M:%S.%N%z' 

その後、元のクエリが再び動作します。

Model.where("updated_at > ?", last_update) 

DateTime.to_s(別名.t)のRails APIを参照してください。 o_formated_s)

+0

これを読んで「もちろん!」と思った。 :) – Nycen

+0

私の問題は、データベースに保存されているタイムスタンプの精度が小数点以下5桁までであったのに対して、クライアントはタイムスタンプを小数点以下3桁まで格納していました...より大きいクエリを実行すると、小数点以下2桁が余分にあるためです。 – JBlake

+1

Railsでミリ秒をサポートするネイティブな方法がないのには驚いています。 : -/ –

1

ISO8601規格を使用している場合は.iso8601(10)を使用できます。理由は分かりませんが、デフォルトでは秒単位に丸められます。

関連する問題