Bagaimana cara membandingkan tanggal di rel tanpa tahun?

Saya mencoba mencari semua pengguna yang berulang tahun dalam 2 minggu mendatang.

Saya mencoba yang berikut ini:

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

yang jelas tidak berfungsi karena 'tahun' di DOB tidak sama dengan tahun ini.

Saya hanya perlu membandingkan bulan dan hari.

Bagaimana saya bisa melakukan ini?


person Jonathan Chiu    schedule 10.09.2011    source sumber


Jawaban (4)


Anda harus melakukan metode mysql pada kolom dob Anda

Sesuatu seperti mengikuti

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

Anda dapat menggunakan fungsi seperti WEEK mana saja yang sesuai untuk Anda Ref ini untuk fungsi mysql

Di rubi

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

Berdasarkan jawaban Salil, saya mendapatkan yang berikut ini agar berfungsi untuk 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

Ini mungkin membantu dalam mengubah format tanggal untuk perbandingan karena secara default akan menggunakan Tanggal.hari ini.tahun.

              Date.strptime("{ #{DOB.month}, #{DOB.date} }", "{ %m, %d }").

Tanggal.strptime("{ 9, 10 }", "{ %m, %d }") memberi

<Date: 2011-09-10 (4911629/2,0,2299161)>

Lakukan posting jika Anda mendapatkan beberapa kode untuk perbandingan langsung.

person Bijendra    schedule 10.09.2011
comment
Apakah ada cara SQL untuk melakukan hal yang sama? Karena saya tidak bisa begitu saja memasukkan kode Ruby ke dalam kondisi saya - person Jonathan Chiu; 10.09.2011

Pendekatan lain untuk 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