Problème :
Vous avez deux colonnes de type datetime
et vous voulez calculer la différence entre eux.
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 secondes) :
SELECT id, départ, arrivée, DATEDIFF(seconde, 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 l'arrival
et le départ en T-SQL, utilisez le DATEDIFF(datepart, startdate, enddate)
une fonction. La datepart
l'argument peut être microsecond
, second
, minute
, hour
, day
, week
, month
, quarter
, ou year
. Ici, vous aimeriez obtenir la différence en secondes, alors choisissez la seconde. Pour obtenir la différence en heures, choisissez hour
; pour la différence en mois, choisissez month
, etc. La startdate
et la enddate
les arguments sont le début et la fin datetime
colonnes, respectivement (ici, departure
et arrival
, respectivement).
Solution 2 (différence en jours, heures, minutes et secondes) :
WITH difference_in_seconds AS ( SELECT id, départ, arrivée, DATEDIFF(SECOND, départ, arrivée) AS secondes FROM voyage),différences AS ( SELECT id, départ, arrivée, secondes, secondes % 60 AS seconds_part, secondes % 3600 AS minutes_part, seconds % (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), ' hours ', 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 l'arrival
et le departure
en secondes, en utilisant le DATEDIFF()
fonction (le premier CTE, nommé difference_in_seconds
), comme dans la solution 1. Ensuite, calculez le nombre de secondes qui dépassent les 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 l'opérateur %. 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 :
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 :
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 le FLOOR()
fonctionner 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 un
datetime
différence sous forme de texte. Vous pouvez facilement modifier la solution pour obtenir uniquement les chiffres sans aucun texte. Vous pouvez également stocker des jours, des heures, des minutes et des secondes dans différentes colonnes :FLOOR(secondes / 3600 / 24) AS jours,FLOOR(hours_part / 3600) AS heures,FLOOR(minutes_part / 60) AS minutes,seconds_part AS secondes