我在使用SQLite3数据库运行的ActiveRecord模型的'find'方法中遇到日期查询的条件。我的模型如下:
Day:
failure_day: date
failure_count: integer
当我尝试查询Days时,我得到以下内容(仅限伪代码):
Query: Days.all
Result: [{failure_day: 2010-04-14, failure_count: 1}]
Query: Days.find(:first, :conditions=>'failure_day > 2010-02-01')
Result: {failure_day: 2010-04-14, failure_count: 1}
Query: Days.find(:first, :conditions=>'failure_day = 2010-04-14')
Result: nil
Query: Days.find(:first, :conditions=>'failure_day < 2010-05-05')
Result: nil
我无法理解的是为什么最后两个查询返回'nil'。第一个查询(Days.all)证明我的数据库中有一条记录。第二个正确匹配'failure_day'与小于'failure_day'的日期,但是当尝试等于或小于它不起作用时。
有什么想法吗?
答案 0 :(得分:3)
你只提供了伪代码,这使得它变得更难。
您告诉我们您的failure_date列的类型为DATE。让ActiveRecord为您处理细节:
Day.all(:conditions => {:failure_date => Date.today})
Day.all(:conditions => ["failure_date < ?", Date.today])
Day.all(:conditions => {:failure_date => Date.new(1900, 1, 1) .. 5.days.ago})
答案 1 :(得分:0)
你应该使用
Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') > '2010-02-01'"])
Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') = '2010-04-14'"])
Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') < '2010-05-05'"])
答案 2 :(得分:0)
这是对FrançoisBeausoleil评论的回答: “您使用的是什么版本的ActiveRecord,SQLite,Ruby?发布一个会话要点,我们可以看到您在控制台输入的代码以及development.log中的内容”
我把它放在这里是因为我无法在评论中进行格式化,如果没有格式化,这篇文章将会非常难以理解!
SQLite version: 3.6.12
ActiveRecord version: 2.3.5
测试代码:
require 'test_helper'
class StatTest < ActiveSupport::TestCase
test "Tmp" do
# Prints: [#<Day id: 980190962, failure_day: "2010-04-14" ... >]
p Day.all
# Prints: []
p Day.all(:conditions=>["failure_day < ?", '2010-05-14'])
# Prints: []
p Day.all(:conditions=>["failure_day < ?", Date.new(2010,5,4)])
end
end
Test.log
Day Load (0.3ms) SELECT * FROM "days"
Day Load (0.1ms) SELECT * FROM "days" WHERE (failure_day < '2010-05-14')
Day Load (0.1ms) SELECT * FROM "days" WHERE (failure_day < '2010-05-04')
直接从SQLite运行任何这些命令会返回预期的行,因此问题不在于ActiveRecord正在生成的SQLite命令。奇异。
答案 3 :(得分:0)
感谢François Beausoleil的探究性问题,我能够找出问题所在。 François提醒我,测试从测试装置加载数据(在我的例子中是test / fixtures / days.yml)。我已经设置了这个,但我认为我最好仔细检查格式。在days.yml文件中,我发现:
one:
failure_day: 2010/04/14
failure_count: 1
注意到日期未定义为2010-04-14,因为我将其更改为:
one:
failure_day: 2010-04-14
failure_count: 1
现在所有查询都有效!