it-swarm.com.de

Wie summiere ich das Zeitfeld in SQL Server?

Ich habe eine Spalte namens "WrkHrs" und der Datentyp ist time (hh: mm: ss). Ich möchte die Arbeitszeiten für die Mitarbeiter zusammenfassen. Aber da es Zeit ist, lässt sich der SQL-Server nicht wie sum(columnname) verwenden.

Wie kann ich den in der SQL-Abfrage angegebenen Zeitdatentyp zusammenfassen?

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

Sie können es schön am Frontend formatieren. Oder in 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;

Sie verwenden jedoch den falschen Datentyp. TIME wird verwendet, um einen Zeitpunkt anzugeben, nicht ein Intervall oder eine Dauer. Wäre es nicht sinnvoll, ihre Arbeitszeit in zwei verschiedenen Spalten zu speichern, nämlich StartTime und EndTime?

25
Aaron Bertrand

Um die Arbeitsstunden für einen Mitarbeiter zusammenzufassen, können Sie die Differenz zwischen Schichtbeginn und Endzeit in Minuten berechnen und wie folgt in ein lesbares Format konvertieren:

    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

Das Ergebnis: 02:47 Zwei Stunden und 47 Minuten

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

Wenn für MS SQL Server Ihre Arbeitszeit als Uhrzeit oder als Varchar gespeichert wird, sollten Sie Folgendes berücksichtigen:

1) Das Zeitformat unterstützt keine Summe, daher müssen Sie es analysieren

2) 23: 59: 59.9999999 ist der Maximalwert für die Zeit. 

Der Code, der funktionieren wird, um die Gesamtzahl der Arbeitsstunden: WorkingMinutes: WorkingSeconds zu ermitteln, wäre der folgende:

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