Problème :
Vous avez deux colonnes de type horodatage et vous souhaitez calculer la différence entre elles.
Exemple :
Dans le travel
table, il y a trois colonnes :id
, departure
, et arrival
. Vous souhaitez calculer la différence entre l'arrival
et le departure
.
Le travel
le tableau ressemble à ceci :
identifiant | départ | arrivée |
---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 |
Solution 1 (différence en jours, heures, minutes ou secondes) :
SELECT id, départ, arrivée, TIMESTAMPDIFF(SECOND, départ, arrivée) AS differenceFROM travel ;
Le résultat est :
identifiant | départ | arrivée | différence |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 934200 |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 3523230 |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 15930 |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 31814700 |
Discussion :
Pour calculer la différence entre les horodatages dans MySQL, utilisez le TIMESTAMPDIFF(unit, start, end)
une fonction. L'argument d'unité peut être MICROSECOND
, SECOND
, MINUTE
, HOUR
, DAY
, WEEK
, MONTH
, QUARTER
, ou YEAR
. Pour obtenir la différence en secondes comme nous l'avons fait ici, choisissez SECOND
. Pour obtenir la différence en minutes, choisissez MINUTE
; pour la différence d'heures, choisissez HOUR
, etc. Les arguments de fin et de début sont respectivement l'horodatage de fin et l'horodatage de début (ici, departure
et arrival
, respectively
).
Solution 2 (différence en jours, heures, minutes et secondes) :
WITH difference_in_seconds AS ( SELECT id, départ, arrivée, TIMESTAMPDIFF(SECOND, départ, arrivée) AS secondes FROM voyage),différences AS ( SELECT id, départ, arrivée, secondes, MOD(secondes, 60) AS seconds_part, MOD (secondes, 3600) AS minutes_part, MOD(secondes, 3600 * 24) AS hours_part FROM difference_in_seconds)SELECT id, départ, arrivée, CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' heures ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS differenceFROM différences ;
Le résultat est :
identifiant | départ | arrivée | différence |
---|---|---|---|
1 | 2018-03-25 12:00:00 | 2018-04-05 07:30:00 | 10 jours 19 heures 30 minutes 0 secondes |
2 | 2019-09-12 15:50:00 | 2019-10-23 10:30:30 | 40 jours 18 heures 40 minutes 30 secondes |
3 | 2018-07-14 16:15:00 | 2018-07-14 20:40:30 | 0 jours 4 heures 25 minutes 30 secondes |
4 | 2018-01-05 08:35:00 | 2019-01-08 14:00:00 | 368 jours 5 heures 25 minutes 0 secondes |
Discussion :
Tout d'abord, calculez la différence entre les horodatages en secondes, en utilisant le TIMESTAMPDIFF()
fonction (le premier CTE, nommé difference_in_seconds
), comme dans la solution 1. Calculez combien de secondes il y a au-delà des minutes entières (seconds_part
) à utiliser plus tard pour calculer les secondes, combien de secondes il y a en plus des heures entières (minutes_part
) à utiliser plus tard pour calculer les minutes, et combien de secondes il y a en plus des heures entières (hours_part
) à utiliser ultérieurement pour calculer les heures.
Pour ce faire, utilisez le MOD()
une fonction. Par exemple, une heure a 3600 secondes, donc pour trouver combien de secondes il y a dans minutes_part
, trouvez le reste de la division par 3600 comme ceci :
MOD(seconds, 3600) AS minutes_part
De même, il y a 3600 * 24
secondes dans une journée, donc pour calculer combien de secondes il y a dans hours_part
, écrivez :
MOD(seconds, 3600 * 24) AS hours_part
Une fois ces restes calculés (dans le second CTE, nommé differences
), vous pouvez enfin obtenir la différence en jours, heures, minutes et secondes. Pour obtenir le nombre de secondes, minutes, heures et jours, divisez le nombre de secondes restantes par le nombre correspondant de secondes en jours, heures ou minutes. Par exemple, pour savoir combien de minutes doivent être affichées, prenez minutes_part
et divisez-le par 60, puisqu'il y a 60 minutes dans une heure. Vous n'avez besoin que de la partie entière (c'est-à-dire sans la partie décimale), utilisez donc la fonction FLOOR() comme ceci :
FLOOR(minutes_part / 60)
Enfin, il vous suffit d'afficher en une seule chaîne ce que vous avez calculé. Pour ce faire, utilisez le CONCAT()
fonction dans la requête externe :
CONCAT( FLOOR(seconds / 3600 / 24), ' days ', FLOOR(hours_part / 3600), ' hours ', FLOOR(minutes_part / 60), ' minutes ', seconds_part, ' seconds' ) AS differenceLa solution présentée ici renvoie la dernière colonne sous forme de texte. Vous pouvez facilement modifier cette solution pour l'afficher dans un autre format. Vous pouvez également afficher les nombres dans des colonnes séparées, comme ceci :
FLOOR(secondes / 3600 / 24) AS jours,FLOOR(hours_part / 3600) AS heures,FLOOR(minutes_part / 60) AS minutes,seconds_part AS secondes