ฉันจะเปรียบเทียบวันที่ใน Rail โดยไม่มีปีได้อย่างไร

ฉันกำลังพยายามค้นหาผู้ใช้ทั้งหมดที่มีวันเกิดในอีก 2 สัปดาห์ข้างหน้า

ฉันลองทำสิ่งต่อไปนี้:

User.find(:all, :conditions => ["DOB > ? and DOB <= ?", Date.today, 2.weeks.from_now])

ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้เพราะ 'ปี' ใน DOB ไม่เท่ากับปีนี้

ฉันต้องเปรียบเทียบเฉพาะเดือนและวันเท่านั้น

ฉันจะทำสิ่งนี้ได้อย่างไร?


person Jonathan Chiu    schedule 10.09.2011    source แหล่งที่มา


คำตอบ (4)


คุณต้องดำเนินการวิธี mysql ในคอลัมน์ dob ของคุณ

บางอย่างเช่นดังต่อไปนี้

  SELECT FROM users  
         WHERE DAYOFYEAR(dob)in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

คุณสามารถใช้ฟังก์ชั่นเช่น WEEK ก็ได้แล้วแต่ว่าแบบไหนเหมาะกับคุณ Ref นี่ สำหรับฟังก์ชัน mysql

ในทับทิม

arr=[]
(0..13).each{|i| arr << (Date.today+i.day).day }
User.find(:all, :conditions => ["DAYOFYEAR(DOB) in (?)", arr])
person Salil    schedule 10.09.2011

จากคำตอบของ 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])
person Jonathan Chiu    schedule 10.09.2011

ซึ่งอาจช่วยในการเปลี่ยนรูปแบบวันที่เพื่อการเปรียบเทียบ โดยค่าเริ่มต้นจะใช้ 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)>

โพสต์หากคุณได้รับโค้ดสำหรับการเปรียบเทียบโดยตรง

person Bijendra    schedule 10.09.2011
comment
มีวิธี SQL ในการทำสิ่งเดียวกันหรือไม่? เพราะฉันไม่สามารถติดโค้ด Ruby เข้ากับเงื่อนไขของฉันได้ - person Jonathan Chiu; 10.09.2011

อีกแนวทางหนึ่งสำหรับ postgresql:

scope :with_bday, -> (from, to) {
    where("EXTRACT(DOY FROM birthday)::int BETWEEN ? AND ?", *[
        from.yday,
        to.yday
    ])
}
person César Parra Moreno    schedule 23.04.2018