Ho una lista di utenti con campo mysql DATE della loro data di nascita. Vorrei realizzare una query che mi mostri il prossimo compleanno di chi sarà, e se possibile, anche in ordine di data crescente, i prossimi compleanni.
Ho una lista di utenti con campo mysql DATE della loro data di nascita. Vorrei realizzare una query che mi mostri il prossimo compleanno di chi sarà, e se possibile, anche in ordine di data crescente, i prossimi compleanni.
Il 90% dei problemi di un pc si trova
tra la tastiera e la sedia.
Vedi se ti va bene
codice:select * from tabella where date_format(data_nascita,'%m-%d') >= date_format(curdate(),'%m-%d') order by date_format(data_nascita,'%m-%d')
faccio l'avvocato del diavolo....Originariamente inviato da nicola75ss
Vedi se ti va bene
codice:select * from tabella where date_format(data_nascita,'%m-%d') >= date_format(curdate(),'%m-%d') order by date_format(data_nascita,'%m-%d')![]()
ma se volessi i compleanni dei prossimi due mesi da oggi???? che succederebbe a quelli di gennaio?
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Fai bene a farlo. In effetti era un pò approssimativa come query.Originariamente inviato da piero.mac
faccio l'avvocato del diavolo....![]()
ma se volessi i compleanni dei prossimi due mesi da oggi???? che succederebbe a quelli di gennaio?
![]()
Controllo quando sarà il prossimo compleanno di ciascun record. Se mese e giorno correnti sono minori o uguali a mese e giorno di nascita, modifico la data di nascita con l'anno corrente, altrimenti all'anno di nascita sostituisco l'anno prossimo.codice:set @intervallo = 2; select * from ( select *, if (right(curdate(),5) <= right(data_nascita,5), concat( year(curdate()),'-',date_format(data_nascita,"%m-%d")), concat( year(curdate()),'-',date_format(data_nascita,"%m-%d")) + interval 1 year) as comp from tabella) as tab where comp between curdate() and curdate() + interval @intervallo month order by comp
Una volta ricavato questo dato estraggo i record compresi nel range specificato dalla variabile intervallo.![]()
sara' che sono un sempliciotto.... e ragiono da tale .... ma mi pare la stessa cosa:
correggimi se sbaglio.codice:$delta = 2; select * from tabella where concat(year(curdate()), date_format(data_nascita, '%m%d')) between curdate() AND curdate() + interval $delta month order by data_nascita![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Ma così non estrae quelli nati ad esempio a gennaio.
si vede che non lo meritano.....Originariamente inviato da nicola75ss
Ma così non estrae quelli nati ad esempio a gennaio.
between curdate() AND curdate() + interval $delta month
between curdate() AND curdate() + interval $delta day /// se conti a giorni di anticipo
@edit.... siccome vuole un certo numero di nomi (indefinito) in anticipo si presume a quantitativo e per periodo. per esempio a partire da oggi per due mesi (da oggi) e non i compleanni del mese.
Almeno la interpreto cosi'.
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Mmm, non sono molto convinto. La mia query e la tua restituiscono risultati diversi (nella tua mi vengono a mancare due record in una mia tabellina di prova con date di nascita 1 e 28 gennaio) ma sicuramente avrai ragione tu.Originariamente inviato da piero.mac
si vede che non lo meritano.....
between curdate() AND curdate() + interval $delta month
![]()
Stasera magari gli do un'occhiata con più calma.![]()
ho editato....Originariamente inviato da nicola75ss
Mmm, non sono molto convinto. La mia query e la tua restituiscono risultati diversi (nella tua mi vengono a mancare due record in una mia tabellina di prova con date di nascita 1 e 28 gennaio) ma sicuramente avrai ragione tu.
Stasera magari gli do un'occhiata con più calma.![]()
la mia versione considera 2 mesi da oggi.... e non i prossimi due mesi. anche perche' suppongo che il range non sia mensilizzato (e' troppo) ma al limite settimanale. In questo caso bastera' cambiare l'interval da sommare......
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Sì, ho visto. Avevo già scritto quando ho letto il tuo edit.![]()