type mssql instruccion delete data columna column change agregar sql sql-server database

instruccion - mssql alter table



Cómo resumir el campo de tiempo en SQL Server (4)

Tengo una columna llamada "WrkHrs" y el tipo de datos es time (hh: mm: ss). Quiero resumir las horas de trabajo de los empleados. Pero como es hora de que el tipo de datos del servidor SQL no me permita usar como sum(columnname) .

¿Cómo puedo resumir el tipo de datos de tiempo fieled en consultas SQL?


Para MS SQL Server, cuando su Tiempo de trabajo se almacena como una hora, o un varchar para resumirlo, debe considerar que:

1) El formato de hora no es una suma compatible, por lo que necesita analizarla

2) 23: 59: 59.9999999 es el valor máximo para el tiempo.

Entonces, el código que funcionará para obtener el número total de WorkingHours: WorkingMinutes: WorkingSeconds sería el siguiente:

SELECT CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) / 3600),''00'') as varchar(max)) + '':'' + CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 / 60),''00'') as varchar(max)) + '':'' + CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 % 60),''00'') as varchar(max)) as WorkingTimeSum FROM TableName


Para resumir las horas de trabajo de un empleado, puede calcular la diferencia entre la hora de inicio y finalización del turno en minutos y convertirla 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.


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


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

Puedes formatearlo bastante en la parte frontal. 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 ?