La diferencia horaria de SQL entre dos fechas da como resultado hh: mm: ss

Estoy enfrentando algunas dificultades para calcular la diferencia de tiempo entre dos fechas.

Lo que quiero es tener dos fechas, por decir

@StartDate = '10/01/2012 08:40:18.000' @EndDate='10/04/2012 09:52:48.000' 

entonces la diferencia entre dos fechas en la forma de hh:mm:ss es 72:42:30 .

¿Cómo puedo obtener este resultado en una consulta T-SQL?

 declare @StartDate datetime, @EndDate datetime select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [hh:mm:ss] 

Esta consulta te será útil.

El código más corto sería:

 Select CAST((@EndDateTime-@StartDateTime) as time(0)) '[hh:mm:ss]' 

Si bien quizás no sea el más eficiente, esto funcionaría:

 declare @StartDate datetime, @EndDate datetime select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) 

si puede ejecutar dos selecciones, entonces esto sería mejor porque solo hace la fechada una vez:

 declare @StartDate datetime, @EndDate datetime select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' declare @Sec BIGINT select @Sec = DateDiff(s, @startDate, @EndDate) select convert(varchar(5),@sec/3600)+':'+convert(varchar(5),@sec%3600/60)+':'+convert(varchar(5),(@sec%60)) 

Si no te opones a la conversión implícita de tipos, te ofreceré una solución alternativa. ¿Es más legible con un mejor formato? Tú eres el juez.

 DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' ,@EndDate datetime = '10/04/2012 09:52:48.000' SELECT STR(ss/3600, 5) + ':' + RIGHT('0' + LTRIM(ss%3600/60), 2) + ':' + RIGHT('0' + LTRIM(ss%60), 2) AS [hh:mm:ss] FROM (VALUES(DATEDIFF(s, @StartDate, @EndDate))) seconds (ss) 
 DECLARE @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12' SELECT CAST((@dt2-@dt1) as time(0)) 

Me gusta la idea de hacer de esto una función para que se vuelva reutilizable y sus consultas sean mucho más fáciles de leer:

 --get the difference between two datetimes in the format: 'h:m:s' CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) RETURNS VARCHAR(10) AS BEGIN DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) DECLARE @difference VARCHAR(10) = CONVERT(VARCHAR(4), @seconds / 3600) + ':' + CONVERT(VARCHAR(2), @seconds % 3600 / 60) + ':' + CONVERT(VARCHAR(2), @seconds % 60) RETURN @difference END 

Uso:

 DECLARE @StartDate DATETIME = '10/01/2012 08:40:18.000' DECLARE @endDate DATETIME = '10/04/2012 09:52:48.000' SELECT dbo.getDateDiff(@startDate, @endDate) AS DateDifference 

Resultado:

  DateDifference 1 73:12:30 

También es más fácil leer el resultado si agrega relleno, por lo que el formato siempre es hh:mm:ss . Por ejemplo, así es como lo haría en SQL Server 2012 o posterior:

 --get the difference between two datetimes in the format: 'hh:mm:ss' CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) RETURNS VARCHAR(10) AS BEGIN DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) DECLARE @difference VARCHAR(10) = FORMAT(@seconds / 3600, '00') + ':' + FORMAT(@seconds % 3600 / 60, '00') + ':' + FORMAT(@seconds % 60, '00') RETURN @difference END 

Tenga en cuenta que esto no recortará la hora si tiene más de 2 dígitos de longitud. Entonces 1 hora aparecería como 01:00:00 y 100 horas se mostrarían como 100:00:00

Eche un vistazo a estos. No usé más paréntesis para mantenerlo legible, así que recuerde que la multiplicación se hace antes de sumr o restar.

Ambos a continuación devuelven:

 hr mins sec timediff 73 12 30 73:12:30 

Esto se escribe para no usar una subconsulta y ser el más legible y comprensible:

 declare @StartDate datetime, @EndDate datetime set @StartDate = '10/01/2012 08:40:18.000' set @EndDate = '10/04/2012 09:52:48.000' select datediff(hour, @StartDate, @EndDate) hr, datediff(minute, @StartDate, @EndDate) - datediff(hour, @StartDate, @EndDate) * 60 mins, datediff(second, @StartDate, @EndDate) - (datediff(minute, @StartDate, @EndDate) * 60) sec, cast(datediff(hour, @StartDate, @EndDate) as varchar)+':'+ cast(datediff(minute, @StartDate, @EndDate) - datediff(hour, @StartDate, @EndDate) * 60 as varchar)+':'+ cast(datediff(second, @StartDate, @EndDate) - (datediff(minute, @StartDate, @EndDate) * 60) as varchar) timediff 

Esta es una versión que funcionaría mejor si tiene muchos datos. Requiere una sub consulta.

 declare @StartDate datetime, @EndDate datetime set @StartDate = '10/01/2012 08:40:18.000' set @EndDate = '10/04/2012 09:52:48.000' select s.seconds / 3600 hrs, s.seconds / 60 - (seconds / 3600 ) * 60 mins, s.seconds - (s.seconds / 60) * 60 seconds, cast(s.seconds / 3600 as varchar) + ':' + cast((s.seconds / 60 - (seconds / 3600 ) * 60) as varchar) + ':' + cast((s.seconds - (s.seconds / 60) * 60) as varchar) timediff from (select datediff(second, @StartDate, @EndDate) as seconds) s 

Hoy me encontré con esta publicación porque estaba tratando de recostackr la diferencia de tiempo entre campos ubicados en tablas separadas, unidas en un campo clave. Este es el código de trabajo para tal esfuerzo. (probado en sql 2010). Ten en cuenta que mi consulta original se unió a 6 tablas en un campo clave común, en el código siguiente he eliminado las otras tablas para no causar confusión al lector.

El propósito de la consulta es calcular la diferencia entre las variables CreatedUTC y BackupUTC, donde la diferencia se expresa en días y el campo se llama “DaysActive”.

 declare @CreatedUTC datetime declare @BackupUtc datetime SELECT TOP 500 table02.Column_CreatedUTC AS DeviceCreated, CAST(DATEDIFF(day, table02.Column_CreatedUTC, table03.Column_EndDateUTC) AS nvarchar(5))+ ' Days' As DaysActive, table03.Column_EndDateUTC AS LastCompleteBackup FROM Operations.table01 AS table01 LEFT OUTER JOIN dbo.table02 AS table02 ON table02.Column_KeyField = table01.Column_KeyField LEFT OUTER JOIN dbo.table03 AS table03 ON table01.Column_KeyField = table03.Column_KeyField Where table03.Column_EndDateUTC > dateadd(hour, -24, getutcdate()) --Gathers records with an end date in the last 24 hours AND table02.[Column_CreatedUTC] = COALESCE(@CreatedUTC, table02.[Column_CreatedUTC]) AND table03.[Column_EndDateUTC] = COALESCE(@BackupUTC, table03.[Column_EndDateUTC]) GROUP BY table03.Column_EndDateUTC, table02.Column_CreatedUTC ORDER BY table02.Column_CreatedUTC ASC, DaysActive, table03.Column_EndDateUTC DESC 

El resultado será el siguiente:

 [DeviceCreated]..[DaysActive]..[LastCompleteBackup] --------------------------------------------------------- [2/13/12 16:04]..[463 Days]....[5/21/13 12:14] [2/12/13 22:37]..[97 Days].....[5/20/13 22:10] 

Es una copia de escritura de scripts luego escriba en su archivo de secuencia de comandos y cambie su campo requerido y salga

 DECLARE @Sdate DATETIME, @Edate DATETIME, @Timediff VARCHAR(100) SELECT @Sdate = '02/12/2014 08:40:18.000',@Edate='02/13/2014 09:52:48.000' SET @Timediff=DATEDIFF(s, @Sdate, @Edate) SELECT CONVERT(VARCHAR(5),@Timediff/3600)+':'+convert(varchar(5),@Timediff%3600/60)+':'+convert(varchar(5),@Timediff%60) AS TimeDiff 
 DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' ,@EndDate datetime = '10/10/2012 09:52:48.000' ,@DaysDifferent int = 0 ,@Sec BIGINT select @Sec = DateDiff(s, @StartDate, @EndDate) IF (DATEDIFF(day, @StartDate, @EndDate) > 0) BEGIN select @DaysDifferent = DATEDIFF(day, @StartDate, @EndDate) select @Sec = @Sec - ( @DaysDifferent * 86400 ) SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] END ELSE BEGIN SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] END ---------------------------------------------------------------------------------- dd HH:MM:SS 9d 1:12:30 
 declare @StartDate datetime, @EndDate datetime select @StartDate = '2016-05-04 10:23:41.083',@EndDate='2016-05-04 10:25:26.053' select CAST(DateDiff(MI, @startDate, @EndDate)/60 AS varchar)+':'+Cast(DateDiff(MI, @startDate, @EndDate)%60 AS varchar)+':'+cast(DateDiff(s, @startDate, @EndDate)%60 AS varchar) as [hh:mm:ss] 

esto te ayudará también

declarar @StartDate datetime, @EndDate datetime

 set @StartDate = '10/01/2012 08:40:18.000' set @EndDate = '10/04/2012 09:52:48.000' SELECT CONVERT(CHAR(8), CAST(CONVERT(varchar(23),@EndDate,121) AS DATETIME) -CAST(CONVERT(varchar(23),@StartDate,121)AS DATETIME),8) AS TimeDiff 
 declare @StartDate datetime; declare @EndDate datetime; select @StartDate = '10/01/2012 08:40:18.000'; select @EndDate='10/04/2012 09:52:48.000'; select cast(datediff(hour,@StartDate,@EndDate) as varchar(10)) + left(right(cast(cast(cast((@EndDate-@StartDate) as datetime) as time) as varchar(16)),14),6)