Rails中的日期比较

时间:2010-02-17 04:54:10

标签: sql ruby-on-rails

我在命名范围内进行日期比较时遇到问题。我正在尝试根据事件的开始和结束日期确定事件是否是最新的。这是我正在使用哪种作品的命名范围,但不适用于具有相同开始和结束日期的事件。

named_scope :date_current, :conditions => ["Date(start_date) <= ? AND Date(end_date) >=  ?", Time.now, Time.now]

这会返回以下记录,但它应该返回两条记录,而不是一条......

>> Event.date_current
=> [#<Event id: 2161, start_date: "2010-02-15 00:00:00", end_date: "2010-02-21 00:00:00", ...]

它没有返回的是这个

>> Event.find(:last)
=> #<Event id: 2671, start_date: "2010-02-16 00:00:00", end_date: "2010-02-16 00:00:00", ...>

服务器时间似乎是UTC格式,我假设这些条目以UTC格式存储在数据库中。关于我做错了什么或尝试什么的任何想法?

谢谢!

4 个答案:

答案 0 :(得分:1)

最简单的调试方法是查看rails日志,看看完全 Rails正在生成什么SQL语句。

如果仍有问题,请发布sql。

与此同时,我的猜测是某些东西没有设置为UTC。什么是集合{操作系统,rails环境,dbms}

补充:另外,为什么要将“Date”(在dbms中)与“Time”值(来自您的陈述)进行比较?最好让类型类明确匹配。我使用新的一天的标准有时间组件00:00:00。这样你就可以在不需要SQL中的日期函数的情况下与db进行比较。

答案 1 :(得分:1)

我在同样的问题上挣扎。记录以UTC格式存储,但utc值未插入查询中。我和你一样,通过手动将其转换为utc来解决它,比如 time.utc

def find_production_since(start_time)
    find(:all, :conditions => ["time > ?", start_time.utc])
end

答案 2 :(得分:1)

这可能会对你有帮助。

named_scope :date_current, :conditions => ["Date(start_date) <= Date(NOW()) AND Date(end_date) >=  Date(NOW())"]

答案 3 :(得分:0)

您可以使用Time.now,而不是使用Date.today(然后根据您的第二条评论费力地转换为日期),这会将“2010-04-20”插入您的SQL,并且应该与Date(start_date)进行比较,而不必担心时间。