我正在尝试选择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)的环境事故,并且不知道在哪里看。可能导致这种情况的任何想法?
答案 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(?)”,虽然这当然效率低得多。