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

Comment calculer la différence entre deux dates et heures dans T-SQL

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 difference 

La 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