Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment calculer la différence entre deux horodatages dans MySQL

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 difference 

La 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