我在Rails 3应用程序中有以下代码:
scope :active, lambda {
where("starts_at <= ? AND ends_at >= ?", Time.now.utc, Time.now.utc)
}
scope :since, lambda { |hide_time|
where("updated_at > ? OR starts_at > ?", hide_time.utc, hide_time.utc) if hide_time
}
def self.display(hide_time)
active.since(hide_time)
end
但是,无论年份是否与当前年度匹配,我都希望返回结果。只要日和月匹配就好了。这可能吗?
starts_at
和ends_at
列的格式为datetime
。因此,即使我没有在表格中设置一年,他们也会自动包括一年:
<%= f.datetime_select :starts_at, :order => [:day, :month], :discard_year => true %>
任何指针都会受到赞赏。
答案 0 :(得分:2)
正如Old Pro在评论中指出的那样,这确实会带来闰年的问题。您可能希望将每年的每年分为MONTH(x)和DAYOFMONTH(x)。
您可以使用dayofyear功能 https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_dayofyear
scope :active, lambda {
where("dayofyear(starts_at) <= dayofyear(?) AND
dayofyear(ends_at) >= dayofyear(?)", Time.now.utc, Time.now.utc)
}
scope :since, lambda { |hide_time|
where("dayofyear(updated_at) > dayofyear(?) OR
dayofyear(starts_at) > dayofyear(?)", hide_time.utc, hide_time.utc) if hide_time
}
在mssql中
日期部分(DAYOFYEAR,日期)
在postgres中
提取(从日期起DOY)
在sqlite3中
strftime(“%j”,日期)