Recherche d'événements au cours des 30 derniers jours

Une autre tâche courante consiste à rechercher des lignes appartenant à une plage de dates spécifique. En principe, ce n'est pas difficile si les dates de début et de fin de la plage sont fixes : SQL peut comparer des dates aussi bien que des nombres.

Les opérateurs de comparaison peuvent être appliqués aux dates : < , > , <= , etc. De plus, il existe un opérateur BETWEEN spécial qui peut également fonctionner avec les dates. Par exemple, écrivons une requête qui sélectionnera toutes les tâches de la table des tâches qui doivent être effectuées à l'été 2022. La requête ressemblera à ceci :

SELECT * FROM task  
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

Le résultat de cette requête sera :

identifiant id_employé nom date limite
1 1 Correction d'un bug sur le frontend 2022-06-01
2 2 Correction d'un bug sur le backend 2022-06-15
3 5 Acheter du café 2022-07-01
4 5 Acheter du café 2022-08-01

Mais quoi écrire dans la demande si nous voulons obtenir des tâches, par exemple, pour les 30 derniers jours. Où les 30 derniers jours sont directement liés au temps d'exécution de la requête. Autrement dit, si la requête est exécutée le 25 juillet, vous devez sélectionner des dates comprises entre le 25 juin et le 24 juillet. Comment lier une plage de dates à l'heure actuelle ?

Pour cela, utilisez la fonction d'ajout de date :

DATE_ADD (date, INTERVAL expression units)

Je pense que ce sera plus facile à expliquer avec quelques exemples :

# Demande Résultat
1 DATE_ADD('2022-06-04', INTERVALLE 5 JOURS) 2022-06-09
2 DATE_ADD('2022-06-04', INTERVALLE 4 SEMAINES) 2022-07-02
3 DATE_ADD('2022-06-04', INTERVALLE 2 MOIS) 2022-08-04
4
5 DATE_SUB('2022-06-04', INTERVALLE 5 JOURS) 2022-05-30
6 DATE_SUB('2022-06-04', INTERVALLE 4 SEMAINES) 2022-05-07
7 DATE_SUB('2022-06-04', INTERVALLE 2 MOIS) 2022-04-04

Soit dit en passant, un certain nombre de jours, de semaines, de mois et d'années peuvent également être soustraits d'une certaine date.

Et si nous revenons à notre demande - pour obtenir des données pour les 30 derniers jours, nous avons besoin de deux dates dans cette plage :

  • CURDATE() - fin de plage
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - début de plage

La requête ressemblera à ceci :

SELECT * FROM task WHERE task.deadline  
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

Le résultat de cette requête sera comme ceci (j'ai aujourd'hui le 4 juin 2022):

identifiant id_employé nom date limite
1 1 Correction d'un bug sur le frontend 2022-06-01

Comment trouver la différence entre deux dates

Et une autre fonctionnalité utile. Parfois, vous devrez peut-être calculer la différence entre deux dates en jours. Pour ce faire, SQL a une fonction spéciale - DATEDIFF ().

Il est très facile de travailler avec elle :

DATEDIFF (date 1, date 2)

La deuxième date est simplement soustraite de la première date. Si date2 est postérieure à date1, le résultat sera négatif.

Au fait, nous pouvons réécrire notre requête précédente en utilisant la fonction DATEDIFF(). Nous devons sélectionner toutes les tâches dans le tableau des tâches dont l'échéance diffère de la date actuelle d'au plus 30 jours. Voici à quoi ressemblerait cette demande :

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30

Le résultat de cette requête sera comme ceci (j'ai aujourd'hui le 4 juin 2022):

identifiant id_employé nom date limite
1 1 Correction d'un bug sur le frontend 2022-06-01
2 2 Correction d'un bug sur le backend 2022-06-15
3 5 Acheter du café 2022-07-01

Cette fois, SQL a trouvé jusqu'à trois lignes. Pensez à pourquoi la dernière fois il y avait une ligne, et cette fois il y en a trois ?