Comparer deux dates dans MySQL
- Création d’un tableau et insertion de valeurs
-
Comparer deux dates à l’aide de la clause
WHERE
-
Comparer deux dates à l’aide de l’opérateur
BETWEEN
-
Comparer deux dates à l’aide de la fonction
DATE_ADD
Cet article explique la comparaison de deux dates dans MySQL. Il existe trois approches différentes pour accomplir cette tâche.
- Utilisation de la clause
WHERE
- Utilisation de l’opérateur
BETWEEN
- Utilisation de la fonction
DATE_ADD
Création d’un tableau et insertion de valeurs
Tout d’abord, je vais créer une table pour les employés comme
Create table employee (empid int primary key, fname varchar(10), lname varchar(20), logindate timestamp not null default CURRENT_TIMESTAMP);
Maintenant, je vais insérer quelques valeurs dans le tableau pour démonstration.
INSERT INTO employee('empid', 'fname', 'lname')VALUES (1,'aaa','bbb');
INSERT INTO employee VALUES
(201,'Peter','Parker','2001-01-01 16:15:00'),
(202,'Thor','Odinson','2021-08-02 12:15:00'),
(204,'Loki','Laufeyson','2009-08-03 10:43:24');
Comparer deux dates à l’aide de la clause WHERE
La requête ci-dessous est une approche très simple utilisant la requête SELECT
qui extrait tous les enregistrements entre la plage de dates donnée.
SELECT * FROM employee WHERE logindate >= '2000-07-05' AND logindate < '2011-11-10';
Comparer deux dates à l’aide de l’opérateur BETWEEN
Premièrement, nous devons convertir la date en chaîne dans MySQL. Pour accomplir cette tâche, nous utiliserons la fonction DATE pour extraire la date d’un Datetime.
La syntaxe de la fonction DATE est ci-dessous.
DATE(column name)
Si vous souhaitez profiter d’un index sur la colonne logindate, vous pouvez essayer ceci à la place. L’opérateur Entre peut également être utilisé pour sélectionner tous les enregistrements qui ont la colonne de date entre deux expressions de date spécifiées.
SELECT * FROM employee WHERE DATE(logindate) BETWEEN '2000-07-05' AND '2011-11-10';
MySQL n’autorise qu’un seul format de date yyyy-mm-dd
, donc chaque fois que vous aurez besoin de formater une expression de date de chaîne, vous devrez utiliser ce format.
Maintenant, vous pouvez avoir une question sur la nécessité de la fonction DATE() en comparaison ?
Ainsi, la fonction MySQL DATE() extrait la partie date de votre colonne DATETIME ou TIMESTAMP dans une chaîne comme indiqué ci-dessous :
mysql> SELECT DATE('2005-08-28 01:02:03'); -> '2005-08-28'
La fonction DATE()
est utilisée pour que MySQL ne considère que la partie date de vos valeurs de colonne pour la comparaison. Lorsque vous n’utilisez pas la fonction DATE()
, MySQL comparera la partie horaire de votre colonne avec votre expression de chaîne. En utilisant cette option, toute comparaison inclura l’expression de chaîne spécifiée dans le jeu de résultats
Lors de la comparaison d’une colonne DATETIME ou TIME-STAMP avec une chaîne représentant une date comme dans la requête ci-dessus, MySQL transformera les valeurs de colonne et d’expression en types entiers longs à des fins de comparaison.
C’est la raison pour laquelle même si vous comparez une colonne de date avec une chaîne, vous n’avez pas besoin de convertir manuellement les valeurs de votre colonne de date en une chaîne.
Comparer deux dates à l’aide de la fonction DATE_ADD
Une autre approche consiste à utiliser la fonction DATE_ADD()
. Cependant, cette approche n’a pas nécessairement besoin de la fonction DATE_ADD()
. Mais si vous souhaitez considérer que quelques minutes après la date souhaitée font partie de la solution, vous pouvez l’utiliser. Par exemple, si je veux tous les enregistrements entre la plage de dates donnée, mais que je peux considérer les enregistrements qui ont été insérés 15 minutes après la limite spécifiée. Cette fonction est très utile.
La fonction DATE_ADD()
est utilisée pour ajouter un intervalle d’heure ou de date spécifié à une date donnée, puis renvoyer la date. La fonction DATE_ADD prend deux paramètres, le premier paramètre est la date et le second est l’intervalle à ajouter
select * from employee
where logindate between '2000-07-05' and DATE_ADD('2011-07-10',INTERVAL 15 MINUTE);