rails3 sqlite日期比较返回null set

时间:2012-07-13 23:38:05

标签: ruby-on-rails ruby sqlite datetime activerecord

我正在尝试选择SQLite DB中将来有日期的所有记录。

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)的环境事故,并且不知道在哪里看。可能导致这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

我的sqlite3开发数据库遇到了类似的问题。

我们使用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解决了它),但希望这会让别人有些沮丧!

答案 1 :(得分:0)

问题源于SQLite将日期时间值存储为字符串。因此,您必须完全匹配格式,并考虑字典排序顺序考虑因素。使用mySQL,Oracle,Postgres等,其中列具有不同的数据类型,这绝不是问题。

获得预期结果的另一种方法是执行“datetime(the_column)&gt; =?”甚至是“datetime(the_column)&gt; = datetime(?)”,虽然这当然效率低得多。