2010-02-17 52 views
1

我在命名范围中遇到日期比较问题。我试图根据它的开始和结束日期来确定事件是否是最新的。以下是我使用哪种作品的命名范围,但不适用于具有相同开始和结束日期的事件。在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存储在数据库中。任何想法,我做错了什么或尝试什么?

谢谢!

回答

0

最简单的调试方法是查看您的rails日志,看看究竟是 Rails正在生成哪些SQL语句。

然后发布sql如果仍然有问题。

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

补充:另外,为什么比较“日期”(在dbms中)和“时间”值(从您的语句)?最好让类型类明确匹配。我使用新时间标准的时间组件00:00:00。这样你就可以与数据库进行比较,而不需要SQL中的日期函数。

+0

嗨拉里K.我昨天发现的是,第二个事件,我想要显示DID显示一天中的大部分时间,并且在UTC时间过去后似乎不再是当前事件。例如,从美国东部标准时间晚上8点开始,该事件不再是最新的,但是在美国东部时间下午5点,这确实使我认为这是一个时区问题。以下是我的本地机器上查询的开发日志输出: SELECT * FROM'events' WHERE((Date(start_date)<='2010-02-17 10:14:10'AND Date(end_date)> ='2010-02-17 10:14:10')AND(events.deleted_at IS NULL OR events.deleted_at>'2010-02-17 15:14:50')) – aressidi 2010-02-17 15:28:56

+0

我已更新date_current named_scope以查看现在这样: named_scope:date_current,:conditions => [“Date(start_date)<=?AND Date(end_date)> =?”,Time.now.time_zone(“UTC”).to_date.to_s,Time。 now.in_time_zone( “UTC”)。TO_DATE。to_s 这会在日志中产生以下内容: SELECT * FROM'events' WHERE((Date(start_date)<='2010-02-17'AND Date(end_date)> ='2010-02-17') AND(events.deleted_at IS NULL OR events.deleted_at>'2010-02-17 15:22:44')) 也许时区需要为+5小时而不是-5小时才能工作...... – aressidi 2010-02-17 15:30:52

1

我挣扎于同样的问题。记录以UTC格式存储,但utc值未插入到查询中。我像你一样,通过手动将它转换为utc来解决它,就像这样:time.utc

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

而不是使用Time.now(然后费力地转换为日期,按您的第二个评论)你可以只使用Date.today,将插入“2010-04-20”到SQL,并应与之比较的日期(start_date)而不用担心时间。

1

这可能对你有帮助。

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