Maison >base de données >tutoriel mysql >Comment trouver efficacement les anniversaires dans les 14 prochains jours, en ignorant l'année ?

Comment trouver efficacement les anniversaires dans les 14 prochains jours, en ignorant l'année ?

DDD
DDDoriginal
2025-01-03 09:53:43397parcourir

How to Efficiently Find Anniversaries Within the Next 14 Days, Ignoring the Year?

Comment ignorer les années dans les mathématiques de date

Problème :
Sélectionner les dates qui ont un anniversaire dans le 14 prochains jours, hors composante année.

Original Requête :

SELECT * FROM events
WHERE EXTRACT(month FROM "date") = 3
AND EXTRACT(day FROM "date") < EXTRACT(day FROM "date") + 14

Problème :
Les mois se terminent, cette requête peut donc manquer les anniversaires qui surviennent après la fin du mois en cours.

Solutions :

1. Utilisation de Generate Series :

SELECT * FROM events
WHERE (date > '2013-03-01' AND date < '2013-04-01')

Cette requête ignore l'année en spécifiant explicitement la plage de dates. Cependant, il n'est pas flexible pour différentes périodes d'anniversaire.

2. Utilisation des mathématiques de date :

SELECT event_date FROM event_table
WHERE (event_date >= CURRENT_DATE AND event_date <= CURRENT_DATE + INTERVAL '14 days');

Cette requête utilise les mathématiques de date pour calculer la plage de dates d'anniversaire. C'est plus flexible mais peut fonctionner plus lentement pour les grandes tables.

3. Utilisation d'une fonction (recommandé) :

CREATE FUNCTION get_anniversary(date date) RETURNS date AS
BEGIN
  RETURN date PARTITION BY YEAR;
END;

SELECT event_date FROM event_table
WHERE get_anniversary(event_date) >= CURRENT_DATE
AND get_anniversary(event_date) <= CURRENT_DATE + INTERVAL '14 days';

Cette requête utilise une fonction pour supprimer l'année de la date. Il crée une partition pour chaque année unique, ce qui le rend plus rapide pour les grandes tables.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn