J'ai une colonne appelée "WrkHrs" et le type de données est time (hh: mm: ss). Je veux résumer les heures de travail des employés. Mais comme il est temps, le type de serveur SQL ne me laisse pas utiliser comme sum(columnname)
.
Comment puis-je résumer le type de données temporelles dans la requête SQL?
SELECT EmployeeID, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs))
FROM dbo.table
-- WHERE ...
GROUP BY EmployeeID;
Vous pouvez le formater assez sur le front-end. Ou 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;
Cependant, vous utilisez un type de données incorrect. TIME
est utilisé pour indiquer un point dans le temps, pas un intervalle ou une durée. Ne serait-il pas judicieux de stocker leurs heures de travail dans deux colonnes distinctes, StartTime
et EndTime
?
Afin de résumer les heures de travail d'un employé, vous pouvez calculer la différence en minutes entre l'heure de début et l'heure de fin de quart et la convertir en format lisible comme suit:
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
Le résultat: 02:47 Deux heures et 47 minutes
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
Pour MS SQL Server, lorsque votre heure de travail est stockée sous forme d'heure ou de varchar, vous devez prendre en compte les éléments suivants:
1) Le format de l'heure ne prend pas en charge la somme, vous devez donc l'analyser
2) 23: 59: 59.9999999 est la valeur maximale pour le temps.
Ainsi, le code qui fonctionnera pour vous obtenir le nombre total de WorkingHours: WorkingMinutes: WorkingSeconds serait le suivant:
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