Lorsque l’ont possède une base de données, il peut être intéressant pouvoir récupérer la liste de membres quelques jours avant une date anniversaire ou une liste d’évènement annuels quelques jours avant une date définie dans l’une des colonnes. Il y a plusieurs raisons envisageables à cela:
- Un site peut vouloir envoyer une offre promotionnelle quelques jours avant la date anniversaire d’inscription. Idem pour envoyer une offre quelques jours avant l’anniversaire du membre.
- Un site peut récupérer la liste des membres dont c’est l’anniversaire dans quelques jours. Pour un site de vente en ligne, récupérer les membres dont l’anniversaire arrive dans quelques jours permet d’envoyer un courrier promotionnel qui arrivera chez le client le jour même de son anniversaire.
- Récupérer la liste d’évènements annuels qui vont bientôt se produire et qui se reproduisent tous les ans le même jour.
Pour effectuer une telle requête SQL il faut ruser car aucune réelle fonction ne peut retourner une différence de N jours par rapport à une date précise (en prenant en compte uniquement le mois et le jour).
Fonctions DATEDIFF()
La fonction DATEDIFF() permet de comparer le nombre de jours d’écart entre 2 dates. Malheureusement, si on compare 2 dates de 2 années différentes, l’écart sera très important. L’écart correspond en quelques sortes à l’écart entre les 2 jours + 365 fois le nombre d’années d’écart.
Fonction DAYOFYEAR()
L’astuce consiste à utiliser la fonction DAYOFYEAR() qui retourne le numéro du jour par rapport au 1er janvier de chaque année. Par exemple, le 20 février est le 51ème jour de l’année. Cette fonction est très pratique pour comparer le nombre de jours de différence entre 2 dates sans prendre en considération l’année.
Requête SQL
Pour récupérer la liste des membres qui auront leur anniversaire dans 10 jours, il convient d’effectuer la requête suivante:
SELECT * FROM membre WHERE dayofyear(date_anniversaire) - dayofyear(NOW()) = 10 OR dayofyear(date_anniversaire) + 365 - dayofyear(NOW()) = 10
Explication de cette requête :
- DAYOFYEAR(date_anniversaire) : retourne le jour de l’anniversaire du membre
- DAYOFYEAR(NOW()) : retourne le jour actuel dans l’année
- DAYOFYEAR(date_anniversaire) – DAYOFYEAR(NOW) : retourne le nombre de jours avant que l’anniversaire ai lieu. Si le nombre est négatif, c’est que l’anniversaire est déjà passé ou que l’ont ai en début d’année.
- DAYOFYEAR(date_anniversaire) + 365 – DAYOFYEAR(NOW) : permet de prendre en compte si la date d’anniversaire du membre est situé entre le 1er janvier et le 10 janvier.
Attention : il y a une petite limitation à cette astuce. Les années bissextiles, entre le 1er janvier et le 10 janvier, la requête retournera les membres qui ont leur anniversaire dans 9 jours (car un année bissextiles comprend 366 jours).