Différence DateTime – SQL

J'essaie d'get la différence DateTime entre deux valeurs DateTime.

Requête que j'ai jusqu'ici,

DECLARE @start datetime = '2012-01-01 12:00:00.000' DECLARE @end datetime = '2013-01-01 11:59:59.999' SELECT CONVERT(VARCHAR(5),DATEDIFF(YYYY, @start, @end)) +'-'+ CONVERT(VARCHAR(5),DATEDIFF(MONTH, @start, @end)) +'-'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)/86400) +' '+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%86400/3600) +':'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%3600/60) +':'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%60)) +'.'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%100)) AS [YYYY-MM-DD HH:MM:SS.MSS] 

Sortie désirée

 0001-00-00 23:59:59.999 365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds 

Sortie réelle

 1-12-366 8784:0:0.0 

Je vous remercie

La précision de la date et heure est arrondie à des incréments de .000, .003 ou .007 secondes. Pour une meilleure précision, utilisez le type de données DateTime2 .

 DECLARE @start datetime2 = '2012-01-01 12:00:00.000' DECLARE @end datetime2 = '2013-01-01 11:59:59.999' --I do this way because millisecond difference overflows the integer. select datediff(day, @start, @end) days, datediff(millisecond, convert(time, @start), convert(time, @end)) milliseconds 

Résultats et démo de violon :

  days | milliseconds 366 | -1 

Au-dessus des résultats signifie que vous pouvez get les résultats souhaités:

  (366 days - 1 millisecond) = 365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds 

EDIT: S'il vous plaît noter que la différence de milliseconde entre deux dates données sont trop élevés et en fait débordement bigint ainsi. Donc j'utilise CETTE APPROCHE pour get la réponse attendue.

J'ai dû changer le début et la fin, il semble que SQL Server arrondissait quand il était .999.

 DECLARE @start datetime = '2012-01-01 00:00:00.000' DECLARE @end datetime = '2013-01-01 23:59:59.997' SELECT CONVERT(VARCHAR(5),DATEDIFF(YYYY, @start, @end)) +'-'+ CONVERT(VARCHAR(5),DATEPART(mm, @Start) - DATEPART(mm, @End)) +'-'+ CONVERT(VARCHAR(5),DATEPART(dd, @Start) - DATEPART(mm, @End)) +' '+ CONVERT(VARCHAR(5),DATEPART(hh, @Start) - DATEPART(hh, @End)) +':'+ CONVERT(VARCHAR(5),DATEPART(mi, @Start) - DATEPART(mi, @End)) +':'+ CONVERT(VARCHAR(5),DATEPART(ss, @Start) - DATEPART(ss, @End)) +'.'+ CONVERT(VARCHAR(5),DATEPART(ms, @Start) - DATEPART(ms, @End)) AS [YYYY-MM-DD HH:MM:SS.MSS]