1

将来の日付を持つSQLiteDBのすべてのレコードを選択しようとしています。

Record.where('scheduled_date > ?', Time.now)

私のコンピュータでは、これは現在空の配列を返します。

ただし、以下を使用する場合:

Record.all.map { |record| record if record.scheduled_date > Time.now }

将来の日付のすべてのレコードの配列を受け取ります。

さらに、自分のマシンで同じRailsプロジェクトを実行している同僚は、ActiveRecordクエリを使用して期待される結果配列を正常に返すことができました。最近プロジェクトへの変更を取り下げた後、このクエリは彼には機能せず、彼のコンピューターは私のように動作します。

このRailsプロジェクトではSQLite(v。1.3.6)またはRails3(v。3.2.3)で環境上の問題が発生している可能性があり、どこを見ればよいかわかりません。これを引き起こしている可能性のあるアイデアはありますか?

4

2 に答える 2

0

私のsqlite3開発DBでも同様の問題がありました。

ActiveSupport::TimeWithZone::to_s(:db) を使用して DB をシードしていました (速度のために ActiveRecord::connection.execute を呼び出します - 同僚のコードで私を判断しないでください :)。

sql =<<-EOL
  INSERT INTO some_table(day)
    VALUES('#{Time.zone.now.beginning_of_day.to_s(:db)}')
EOL
SomeTable.connection.execute(sql)

クエリの場合、TimeWithZone 範囲を ARel in ステートメントに渡していました (間に SQL を生成するため)。

SomeTable.where(SomeTable.arel_table[:day].in((Time.zone.now.beginning_of_day)..(1.day.from_now)))

to_s(:db) からのタイムスタンプは次のようになります。2013-10-01 04:00:00

arel によって生成されたクエリのタイムスタンプは、次のようになります。2013-10-01 04:00:00.000000

これらは同等であるはずですが、DB は後者を前者より遅いと解釈しました。小数秒の違いに偶然出くわすのに永遠にかかりました.sqlite3実装のバグのように見えます( https://bugs.freedesktop.org/show_bug.cgi?id=50575を参照)。

これはあなたの問題ではなかったかもしれませんが(iso8601が解決したので)、うまくいけば、これが他の誰かの不満を救うでしょう!

于 2012-10-22T19:32:22.553 に答える
0

この問題は、SQLite が日時の値を文字列として格納するという事実に起因しています。したがって、辞書式の並べ替え順序を考慮して、形式を正確に一致させる必要があります。列のデータ型が異なる mySQL、Oracle、Postgres などでは、これが問題になることはありません。

期待する結果を得る別の方法は、「datetime(the_column) >= ?」を実行することです。もちろん、これははるかに効率的ではありませんが。

于 2013-12-12T15:55:59.313 に答える