当我创建一个SQL Time列时,我得到一个纯粹的时间,即。无日期。但是当我使用Ruby Time类时,我也会得到一个日期。问题是当'找到'生成的SQL包含一个日期时,我似乎得到了奇怪的结果。
表
start_date: time
end_time: time
day_of_week: string
ActiveRecord的
def self.now_playing
self.find(:first, :conditions => ['day_of_week = ? AND end_time > ? AND start_time < ?', Time.now.strftime('%A'), Time.now, Time.now])
end
SQL
SELECT * FROM `schedules` WHERE (day_of_week = 'Saturday' AND end_time > '2009-06-20 10:19:59' AND start_time < '2009-06-20 10:19:59') LIMIT 1
生成的SQL包含一个日期,这可能是我得到奇怪结果的原因,例如,当给定时间有一个时间表时没有返回记录?但是,如果列是纯时间列,MySQL是否应该忽略日期部分?
答案 0 :(得分:3)
Ruby中的时间更像是时间戳...总是有一个日期。 ActiveSupport具有内置的转换功能,因此如果日期搞砸了您的结果,您可以使用#to_s(:format)来获得所需的结果。默认情况下,有一个:time选项,但它只返回小时/分钟(%H:%M),如果你需要秒,你还需要添加另一种格式......
创建一个名为time_formats.rb的初始化程序,然后添加:
ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!({
:time_long => "%H:%M:%S"
})
Time::DATE_FORMATS.merge!(
:time_long => "%H:%M:%S"
)
然后在你的发现者中,就这样做:
def self.now_playing
time = Time.now
self.find(:first, :conditions => ['day_of_week = ? AND end_time > ? AND start_time < ?', time.strftime('%A'), time.to_s(:time_long), time.to_s(:time_long)])
end
可以在此处找到更多信息:http://jasonseifer.com/2010/03/10/rails-date-formats
或者在这里:http://brian.rarevisions.net/extending-date-formats-in-rails-3