89 votes

Différence de deux dates du temps dans sql server

Est-il possible de prendre la différence entre les deux datetime dans sql server?

Par exemple, mes dates sont

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

Alors, le résultat devrait être 14.063 seconds.

98voto

Andrew Points 14278

Juste un bémol à ajouter au sujet de l'DateDiff, il compte le nombre de fois que vous passez la frontière, vous indiquez que vos unités, est donc soumis à des problèmes si vous êtes à la recherche pour un laps de temps précis. par exemple

select datediff (m, '20100131', '20100201')

donne une réponse de 1, parce qu'il a franchi les limites de janvier à février, donc, même si la durée est de 2 jours, datediff doit retourner une valeur de 1 - la traversée de 1 date limite.

select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

Donne une valeur de 1, encore une fois, il est passé à la minute limites d'une seule fois, donc, même si elle est d'environ 14 secondes, il serait retourné comme une seule minute lors de l'utilisation de Minutes que les unités.

32voto

gbn Points 197263
SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

Remplacer "MyUnits" basé sur DATEDIFF sur MSDN

19voto

Quassnoi Points 191041
SELECT  DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

Remplacer day avec d'autres unités que vous voulez pour obtenir la différence, comme second, minute etc.

5voto

Jon of All Trades Points 1925

Il y a un certain nombre de façons de regarder une date de différence, et plus encore lorsque l'on compare les dates/heures. Voici ce que j'utilise pour obtenir la différence entre deux dates au format "HH:MM:SS":

ElapsedTime AS
      RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)

J'ai utilisé ce pour une colonne calculée, mais vous pourrait trivialement réécrire sous la forme d'un UDF de requête ou de calcul. Notez que cette logique arrondit les fractions de secondes; 00:00.00 00:00.999 est considéré comme zéro secondes, et affiche "00:00:00".

Si vous pensez que les délais peuvent être plus que quelques jours de temps, ce commutateurs de code D:HH:MM:SS en cas de besoin:

ElapsedTime AS
    CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
        THEN
                          CAST(DATEDIFF(S, StartDate, EndDate) / 86400        AS VARCHAR(7)) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %  3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %    60        AS VARCHAR(2)), 2)
        ELSE
              RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
        END

5voto

RedFilter Points 84190

En interne dans SQL Server dates sont stockées en tant que 2 nombres entiers. Le premier entier est le nombre de dates avant ou après la date de base (1900/01/01). Le deuxième entier stocke le nombre de tops d'horloge après minuit, à chaque itération est 1/300 de seconde.

Plus d'info ici

De ce fait, je trouve souvent le moyen le plus simple pour comparer les dates, c'est tout simplement de soustraire eux. Cela gère 90% de mon cas d'utilisation. E. g.,

select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...

Quand j'ai besoin d'une réponse dans d'autres unités de jours, je vais utiliser DateDiff.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X