【问题标题】:Rails 2.3.5 - ".find" function doesn't work with (:condition =>"date") optionRails 2.3.5 - ".find" 函数不适用于 (:condition =>"date") 选项
【发布时间】:2014-01-20 10:23:03
【问题描述】:

我想做的是查找过去 60 天内使用过的特定记录。

我正在使用 Oracle (9i), 导轨 v:2.3.5, 红宝石 v:1.8.7

我定义日期间隔的代码是:

date =(((Time.now - 60.days).strftime("%d-%b-%y"))...(Time.now.strftime("%d-%b-%y")))

这是我的使用方法:

conditions = {}
conditions[:start_date] = date
conditions[:account_no] = account_number

results = MyModel.find(:all, :conditions => conditions)

要查看选择了什么,我基本上是这样做的:

results.each {|r|
  if (!(r.column_name.nil?))
     #do something here
  end
}

结果: 代码正在运行,但“结果”为空

但是,当我将“MyModel.find...”生成的查询复制并粘贴到 sqlDeveloper 时,我可以明确地看到我想要的。

虽然我使用上面代码生成的相同查询,但我无法使用 SQL Developer 获得相同的结果应该是什么原因

【问题讨论】:

  • 取出strftimes,并传递原始时间值。 Rails 非常擅长将任何内容转换为正确的数据库格式。
  • 我不相信它有效,谢谢..但我仍然无法理解生成的查询是如何工作的,但代码不是..再次感谢
  • 你为什么要通过缩写月份%b?这是数据的存储方式吗?通常 Rails 将日期存储为 %Y-%m-%d 您传递的是字符串范围而不是日期。
  • 数据库将日期存储为(例如:“11-Oct-13”),这就是我使用 strftime 的原因。现在问题解决了,我只是生气,因为rails生成的查询正在工作,所以我从来没有想过删除strftime。

标签: ruby-on-rails ruby oracle date conditional-statements


【解决方案1】:

鉴于 start_date 是一个日期,以下应该可以工作

date =((DateTime.now - 60)...(DateTime.now))
conditions = {}
conditions[:start_date] = date
conditions[:account_no] = account_number

results = MyModel.find(:all, :conditions => conditions)

这将导致日期成为日期范围,而不是字符串范围。

现在如果你运行 date.to_a 它返回一个空数组,因为它是一个不正确的范围。

如果您使用 date.to_a 运行上述命令,它将返回一个不包括今天日期的 60 天的日期数组。这将在生成的 SQL 中创建正确的 IN 语句

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多