2012-03-15 8 views
19

Tengo una columna llamada "WrkHrs" y el tipo de datos es el tiempo (hh: mm: ss). Quiero resumir las horas de trabajo para los empleados. Pero como es hora, el tipo de datos del servidor sql no me permite usar como sum(columnname).Cómo resumir el campo de tiempo en SQL Server

¿Cómo puedo resumir el tipo de datos de tiempo fieled en la consulta sql?

+2

¿Y por qué usa 'TIME' para esto en lugar de' INT' o 'NUMERIC''. Dado que los datos son 'TIME ', ¿a qué debería responder su consulta cuando las horas de trabajo que está agregando son más grandes que 24 ?, ¿debería el resultado ser un' INT '? – Lamak

+0

... o dos columnas separadas. –

+0

@Lamak Sí, creo que también podría usar el tipo de datos numéricos. Eso sería más fácil para mí. – Sas

Respuesta

21
SELECT EmployeeID, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
FROM dbo.table 
-- WHERE ... 
GROUP BY EmployeeID; 

Puede formatearlo bonito en la parte delantera. O en T-SQL:

;WITH w(e, mw) AS 
(
    SELECT EmployeeID, SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs)) 
    FROM dbo.table 
    -- WHERE ... 
    GROUP BY EmployeeID 
) 
SELECT EmployeeID = e, 
    WrkHrs = RTRIM(mw/60) + ':' + RIGHT('0' + RTRIM(mw%60),2) 
    FROM w; 

Sin embargo, está utilizando el tipo de datos incorrecto. TIME se usa para indicar un punto en el tiempo, no un intervalo o duración. ¿No tendría sentido almacenar sus horas de trabajo en dos columnas distintas, StartTime y EndTime?

+0

Intenté dos columnas, pero el problema era que la función de timediff calcula la diferencia entre horas o minutos, pero no juntas. No pude encontrar una manera de calcular horas y minutos juntos. Es por eso que elijo esto. – Sas

+1

en mi humilde opinión esto no es un problema. Siempre puede obtener horas/minutos de minutos. 230 minutos = 2 horas y 50 minutos. Demuestro exactamente esto en mi respuesta. –

2
DECLARE @Tab TABLE 
(
    data CHAR(5) 
) 

INSERT @Tab 
SELECT '25:30' UNION ALL 
SELECT '31:45' UNION ALL 
SELECT '16:00' 

SELECT STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes, 
    '19000101'), 8), 1, 2, CAST((theHours + theMinutes)/3600 AS VARCHAR(12))) 
FROM (
    SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 * 
     LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours, 
    ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 * 
     SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes 
    FROM @Tab 
) AS d 
3

Con el fin de resumir las horas de trabajo de un empleado se puede calcular la diferencia entre el cambio de hora de inicio y hora de finalización en cuestión de minutos y convertirlo a un formato legible de la siguiente manera:

DECLARE @StartTime  datetime = '08:00' 
    DECLARE @EndTime  datetime = '10:47' 
    DECLARE @durMinutes  int 
    DECLARE @duration  nvarchar(5) 

    SET @durMinutes = DATEDIFF(MINUTE, @StartTime, @EndTime) 

    SET @duration = 
    (SELECT RIGHT('00' + CAST((@durMinutes/60) AS VARCHAR(2)),2) + ':' + 
      RIGHT('00' + CAST((@durMinutes % 60) AS VARCHAR(2)), 2)) 

    SELECT @duration 

El resultado: 02:47 dos horas y 47 minutos

Cuestiones relacionadas