sql >> Databasteknik >  >> RDS >> Mysql

Hur skapar man modulen för kommande födelsedagar i Rails?

Flera svar har föreslagit att man beräknar/lagrar dagen på året och sortera på det, men bara detta kommer inte att göra mycket nytta när du är nära slutet av året och behöver tänka på folk som fyller år i början av nästa år.

Jag skulle välja en lösning där du beräknar hela datumet (år, månad, dag) för varje persons nästa födelsedag , sortera sedan på det. Du kan göra detta i Ruby-kod, eller med en lagrad procedur i databasen. Det senare kommer att vara snabbare, men kommer att göra din app svårare att migrera till en annan db-plattform senare.

Det skulle vara rimligt att uppdatera den här listan över kommande födelsedagar endast en gång per dag, vilket innebär att du kan använda någon form av cachning. Således är hastigheten på frågan/koden som behövs är mindre av ett problem, och något sådant här borde fungera bra så länge du cachelagrar resultatet:

class User
  def next_birthday
    year = Date.today.year
    mmdd = date_of_birth.strftime('%m%d')
    year += 1 if mmdd < Date.today.strftime('%m%d')
    mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap?
    return Date.parse("#{year}#{mmdd}")
  end
end

users = User.find(:all, :select => 'id, date_of_birth').sort_by(&:next_birthday).first(5)

Redigera :Fast för att fungera korrekt med skottår.



  1. MySQL felaktigt strängvärde fel vid spara unicode sträng i Django

  2. Hur INSTR() fungerar i MariaDB

  3. MySQL - Kan inte skapa vy med SET-variabel inuti

  4. GROUP BY + CASE uttalande