【发布时间】:2011-09-10 10:37:31
【问题描述】:
我正在尝试查找未来 2 周内所有生日的用户。
我尝试了以下方法:
User.find(:all, :conditions => ["DOB > ? and DOB <= ?", Date.today, 2.weeks.from_now])
这显然行不通,因为 DOB 中的“年份”不等于今年。
我只需要比较月份和日期。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails date compare
我正在尝试查找未来 2 周内所有生日的用户。
我尝试了以下方法:
User.find(:all, :conditions => ["DOB > ? and DOB <= ?", Date.today, 2.weeks.from_now])
这显然行不通,因为 DOB 中的“年份”不等于今年。
我只需要比较月份和日期。
我该怎么做?
【问题讨论】:
标签: ruby-on-rails date compare
你必须在你的 dob 列上执行 mysql 方法
类似以下的东西
SELECT FROM users
WHERE DAYOFYEAR(dob)in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
您可以使用 WEEK 之类的函数,无论哪个对您有用 Ref this 用于 mysql 函数
在红宝石中
arr=[]
(0..13).each{|i| arr << (Date.today+i.day).day }
User.find(:all, :conditions => ["DAYOFYEAR(DOB) in (?)", arr])
【讨论】:
根据 Salil 的回答,我得出以下结论以使其适用于 sqlite:
arr = []
(0..14).each { |i| arr << (Date.today + i.day).yday }
@users = User.find(:all, :conditions => ["cast(strftime('%j', DOB) AS int) in (?)", arr])
【讨论】:
这可能有助于更改日期格式以进行比较,因为默认情况下它将采用 Date.today.year。
Date.strptime("{ #{DOB.month}, #{DOB.date} }", "{ %m, %d }").
Date.strptime("{ 9, 10 }", "{ %m, %d }") 给出
<Date: 2011-09-10 (4911629/2,0,2299161)>
如果你得到一些直接比较的代码,请发布。
【讨论】:
postgresql 的另一种方法:
scope :with_bday, -> (from, to) {
where("EXTRACT(DOY FROM birthday)::int BETWEEN ? AND ?", *[
from.yday,
to.yday
])
}
【讨论】: