2008-09-17 14 views
5

Tengo una tabla en mi base de datos con los registros de inicio y finalización de una tarea específica. Este es un ejemplo de los datos:Transact-SQL para resumir el tiempo transcurrido

Start      Stop 
9/15/2008 5:59:46 PM  9/15/2008 6:26:28 PM 
9/15/2008 6:30:45 PM  9/15/2008 6:40:49 PM 
9/16/2008 8:30:45 PM  9/15/2008 9:20:29 PM 
9/16/2008 12:30:45 PM  12/31/9999 12:00:00 AM 

me gustaría escribir un script que asciende hasta los minutos transcurridos estos plazos, y donde hay una fecha 12/31/9999, quiero que use la fecha y hora actual, ya que esto todavía está en progreso.

¿Cómo haré esto usando Transact-SQL?

Respuesta

11
SELECT SUM(CASE WHEN Stop = '31 dec 9999' 
        THEN DateDiff(mi, Start, Stop) 
        ELSE DateDiff(mi, Start, GetDate()) 
      END) AS TotalMinutes 
FROM task 

Sin embargo, una mejor solución sería hacer la parada anulable campo, y que sea nula cuando la tarea todavía se está ejecutando. De esta manera, usted puede hacer esto:

SELECT SUM(DateDiff(mi, Start, IsNull(Stop, GetDate())) AS TotalMinutes 
FROM task 
0

El datediff function puede mostrar los minutos transcurridos. La sentencia if para la comprobación 12/31/9999 te dejo como ejercicio para el lector ;-)

0

--usted puede jugar con el datediff usando mi por minuto

- esto le dan segundo de cada tarea

select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable 

- suma

Select Sum(duration_in_seconds) 
from 
(
select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable)x 
0

DATEDIFF se vuelve más difícil de usar y cuando tenga más dateparts en su diferencia (es decir, en su caso, se parece a minutos y segundos; en ocasiones horas) Afortunadamente, en la mayoría de las variaciones de TSQL, simplemente puede realizar operaciones matemáticas en las fechas. Asumiendo que esto es un campo de fecha, puede probablemente sólo consulta:

seleccione la duración = parada - inicio

Para un ejemplo práctico, vamos a seleccionar la diferencia entre dos datetimes sin molestarse con una mesa:

seleccione convert (datetime, '2008-09-17 04: 56: 45.030') - convert (datetime, '2008-09-17 04: 53: 05.920')

que devuelve "1900-01-01 00:03 : 39.110 ", lo que indica que hay cero años/meses/días; 3 minutos, 39.11 segundos entre estos dos tiempos de fecha. A partir de ahí, su código puede TimeSpan.Parche este valor.

2

Probar:

Select Sum(
    DateDiff(
     Minute, 
     IsNull((Select Start where Start != '9999.12.31'), GetDate()), 
     IsNull((Select End where End != '9999.12.31'), GetDate()) 
    ) 
) 
from *tableName* 
1

El siguiente trabajo para SQL Server, otras bases de datos utilizan diferentes funciones para el cálculo de la fecha y conseguir la hora actual.

Select Case When (Stop <> '31 Dec 9999') Then 
      DateDiff(mi, Start, Stop) 
     Else 
      DateDiff(mi, Start, GetDate()) 
     End 
From ATable 
0

Usando la ayuda de AJ answer, de BelowNinety answer y Nerdfest de answer, me ocurrió lo siguiente:

Select Sum(
    Case When End = '12/31/9999 12:00:00 AM' Then 
     DateDiff(mi, Start, Getdate()) 
    Else 
     DateDiff(mi, Start, End) 
    End) As ElapsedTime 
From Table 

Gracias por la ayuda!

3

creo que esto es más limpio:

SELECT SUM(
       DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate())) 
      ) AS ElapsedTime 
    FROM Table 
Cuestiones relacionadas