2012-05-29 10 views
5

Actualmente estoy trabajando un script SQL para calcular la diferencia entre dos fechas que me daría el resultado en formato DD: HH: MI: SEC. Ejemplo: Fecha 1: 7/30/12 16:00 Fecha 2: 5/4/12 10:31Calcular DateDiff en SQL en días: Horas: Mins: formato de segundos

Y el resultado debería ser 87: 05: 29: 00

Puede amablemente ayuda con el guion para esto? Saludos, Arjun

+2

¿Qué estás usando? sql-server, oracel, mysql – Arion

+0

¿Qué RDBMS y qué has probado? – Rahul

+0

Obtuvo 26k visitas y una insignia de oro para esto: | – OGHaza

Respuesta

9

Si está utilizando SQL-servidor, entonces usted puede hacer esto:

declare @x int, 
     @dt1 smalldatetime = '1996-03-25 03:24:16', 
     @dt2 smalldatetime = getdate() 

set @x = datediff (s, @dt1, @dt2) 


SELECT convert(varchar, @x/(60 * 60 * 24)) + ':' 
+ convert(varchar, dateadd(s, @x, convert(datetime2, '0001-01-01')), 108) 

Referencia here

0

Hola he tenido un problema similar, se tomó un tiempo para pensar y aquí es mi solución, he tenido la tabla con suscripciones de usuarios, hay una hora de inicio y una hora de cierre tristes, mi problema era un poco más complejo, básicamente se reducía a esto:

SELECT subscription_id, time_open, time_closed, TIMESTAMPDIFF(DAY,time_open,time_closed) AS Day, 

HOUR(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Hour, 

MINUTE(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Minute, 

SECOND(sec_to_time(TIMESTAMPDIFF(SECOND,ADDDATE(`time_open`, INTERVAL TIMESTAMPDIFF(DAY,time_open,time_closed) DAY),`time_closed`))) AS Second 

FROM `user_subscription` 

Así que, básicamente, lo que hace esta consulta es que calcula los días deduciendo las fechas en la primera línea. Luego agrega el número de días completos a la hora de inicio y reduce el tiempo de cierre a la suma, por lo que lo que queda es el tiempo en el día actual. Después de eso, solo selecciona Horas, minutos y segundos a partir de eso. Si lo quiere todo junto, puede concatenar las cadenas, pero de esta forma puede usarlo más, a diferencia de las cadenas.

0

Bueno, si desea llevar a cabo algunos cálculos, se puede hacer esto también:

DECLARE @SecsInADay INT = 60 * 60 * 24 
DECLARE @DATE1 DATETIME = CONVERT(DATETIME,'30/07/2012 16:00:00') 
DECLARE @DATE2 DATETIME = CONVERT(DATETIME,'04/05/2012 10:31:00') 
DECLARE @Days INT = DATEDIFF(DAY, @DATE2, @DATE1) 
DECLARE @DiffInSeconds INT = DATEDIFF(SECOND, @DATE2, @DATE1) 
DECLARE @TotalDaysInSeconds INT = @Days * @SecsInADay 
DECLARE @RemainingHours INT = @DiffInSeconds - @TotalDaysInSeconds 
DECLARE @Hours INT = @RemainingHours/3600 
DECLARE @Seconds INT = @RemainingHours % 3600 
DECLARE @Minutes INT = @Seconds/60 
DECLARE @RemainingSeconds INT = @Seconds % 60 

SELECT 
CASE WHEN @Days < 10 THEN '0' + CAST(@Days AS VARCHAR) ELSE CAST(@Days AS VARCHAR) END + ':' + 
CASE WHEN @Hours < 10 THEN '0' + CAST(@Hours AS VARCHAR) ELSE CAST(@Hours AS VARCHAR) END + ':' + 
CASE WHEN @Minutes < 10 THEN '0' + CAST(@Minutes AS VARCHAR) ELSE CAST(@Minutes AS VARCHAR) END + ':' + 
CASE WHEN @RemainingSeconds < 10 THEN '0' + CAST(@RemainingSeconds AS VARCHAR) ELSE CAST(@RemainingSeconds AS VARCHAR) END 
Cuestiones relacionadas