web-dev-qa-db-fra.com

Comment résumer le champ de temps dans SQL Server

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?

22
Sas
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?

25
Aaron Bertrand

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

4
A Ghazal
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
2
Murugan

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
1
Alex Petrov