为什么ActiveRecord生成的SQL包含Time列的Date?

时间:2009-06-20 09:28:15

标签: mysql ruby-on-rails time

当我创建一个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是否应该忽略日期部分?

1 个答案:

答案 0 :(得分:3)

Ruby中的时间更像是时间戳...总是有一个日期。 ActiveSupport具有内置的转换功能,因此如果日期搞砸了您的结果,您可以使用#to_s(:format)来获得所需的结果。默认情况下,有一个:time选项,但它只返回小时/分钟(%H:%M),如果你需要秒,你还需要添加另一种格式......

创建一个名为time_formats.rb的初始化程序,然后添加:

Rails 2-ish

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!({
  :time_long => "%H:%M:%S"
})

Rails 3

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