Ich habe eine Tabelle mit dem Namen DeviceLogs_8_2016
, in der alle Aufzeichnungen von In-Time- und Out-Time-Aufzeichnungen von Mitarbeitern gespeichert sind.Berechne die Dauer und die Dauer des Mitarbeiters
Tabellenname ändert sich jeden Monat. Ex: Die Aufzeichnungen von 2016-09-01 0:00:00
würde in Tabelle DeviceLogs_9_2016
Tabelle enthält Aufzeichnungen aller Mitarbeiter wie unter dem Namen gespeichert werden, aber ich brauche nur einen einzelne Benutzer-ID an einem bestimmten Datum.
+--------+---------------------+-----------+
| UserId | LogDate | Direction |
+--------+---------------------+-----------+
| 7034 | 2016-08-08 08:21:14 | in |
| 5012 | 2016-08-08 08:21:26 | out |
| 7036 | 2016-08-08 08:21:34 | in |
| 7034 | 2016-08-08 10:01:14 | in |
| 8015 | 2016-08-08 10:10:39 | in |
| 2055 | 2016-08-08 10:11:27 | in |
| 209 | 2016-08-08 11:28:25 | out |
| 209 | 2016-08-08 11:32:32 | in |
| 11253 | 2016-08-08 12:35:17 | out |
| 7034 | 2016-08-08 12:37:58 | in |
| 7034 | 2016-08-08 13:30:13 | out |
| 4586 | 2016-08-08 13:30:24 | in |
| 7034 | 2016-08-08 13:30:28 | out |
| 209 | 2016-08-08 13:35:36 | out |
+--------+---------------------+-----------+
Beispieldaten mit nur einzelne Benutzer-ID für den ganzen Tag ist, wie nachfolgend beschrieben
+--------+---------------------+-----------+
| UserId | LogDate | Direction |
+--------+---------------------+-----------+
| 7034 | 2016-08-08 08:20:59 | in |
| 7034 | 2016-08-08 08:21:04 | in |
| 7034 | 2016-08-08 08:21:14 | in |
| 7034 | 2016-08-08 08:21:26 | out |
| 7034 | 2016-08-08 08:21:34 | in |
| 7034 | 2016-08-08 09:35:26 | out |
| 7034 | 2016-08-08 10:01:14 | in |
| 7034 | 2016-08-08 12:35:17 | out |
| 7034 | 2016-08-08 12:37:58 | in |
| 7034 | 2016-08-08 13:29:13 | out |
| 7034 | 2016-08-08 13:30:08 | out |
| 7034 | 2016-08-08 13:30:13 | out |
| 7034 | 2016-08-08 14:30:24 | in |
| 7034 | 2016-08-08 17:30:24 | out |
| 7034 | 2016-08-08 17:40:24 | in |
| 7034 | 2016-08-08 22:15:38 | out |
| 7034 | 2016-08-08 22:50:05 | in |
| 7034 | 2016-08-09 01:20:05 | out |
| 7034 | 2016-08-09 01:22:10 | in |
| 7034 | 2016-08-09 04:50:15 | out |
+--------+---------------------+-----------+
In Anbetracht der Teilnahme an diesem Tag von 2016-08-08 05:00:00
beginnt und endet an 2016-08-09 05:00:00
.
Ich möchte die Gesamt-In-Duration und Gesamt-Out-Dauer des Mitarbeiters an diesem Tag berechnen. Wenn In oder Out kontinuierlich erscheint, können wir nur das letzte In vor Out und das erste Out vor In betrachten.
Ich möchte Ergebnis wie
+--------+------------+-------------+--------------+
| UserId | LogDate | In_Duration | Out_Duration |
+--------+------------+-------------+--------------+
| 7034 | 2016-08-08 | 18:12:41 | 02:16:20 |
+--------+------------+-------------+--------------+
ich die Berechnungen in einer Excel-Tabelle für die angegebenen Beispieldaten ausgearbeitet werden müssen.
╔═════════╦════════╦═════════════════════╦═══════════╦══════════╦══════════╦══════════════════╗
║ row_sno ║ UserId ║ LogDate ║ Direction ║ In_Diff ║ Out_Diff ║ Diff_Calculation ║
╠═════════╬════════╬═════════════════════╬═══════════╬══════════╬══════════╬══════════════════╣
║ 1 ║ 7034 ║ 2016-08-08 08:20:59 ║ in ║ ║ ║ ║
║ 2 ║ 7034 ║ 2016-08-08 08:21:04 ║ in ║ ║ ║ ║
║ 3 ║ 7034 ║ 2016-08-08 08:21:14 ║ in ║ ║ ║ ║
║ 4 ║ 7034 ║ 2016-08-08 08:21:26 ║ out ║ 00:00:12 ║ ║ 4th - 3th row ║
║ 5 ║ 7034 ║ 2016-08-08 08:21:34 ║ in ║ ║ 00:00:08 ║ 5th - 4th row ║
║ 6 ║ 7034 ║ 2016-08-08 09:35:26 ║ out ║ 01:13:52 ║ ║ 6th - 5th row ║
║ 7 ║ 7034 ║ 2016-08-08 10:01:14 ║ in ║ ║ 00:25:48 ║ 7th - 6th row ║
║ 8 ║ 7034 ║ 2016-08-08 12:35:17 ║ out ║ 02:34:03 ║ ║ 8th - 7th row ║
║ 9 ║ 7034 ║ 2016-08-08 12:37:58 ║ in ║ ║ 00:02:41 ║ 9th - 8th row ║
║ 10 ║ 7034 ║ 2016-08-08 13:29:13 ║ out ║ 00:51:15 ║ ║ 10th - 9th row ║
║ 11 ║ 7034 ║ 2016-08-08 13:30:08 ║ out ║ ║ ║ ║
║ 12 ║ 7034 ║ 2016-08-08 13:30:13 ║ out ║ ║ ║ ║
║ 13 ║ 7034 ║ 2016-08-08 14:30:24 ║ in ║ ║ 01:01:11 ║ 13th - 10th row ║
║ 14 ║ 7034 ║ 2016-08-08 17:30:24 ║ out ║ 03:00:00 ║ ║ 14th - 13th row ║
║ 15 ║ 7034 ║ 2016-08-08 17:40:24 ║ in ║ ║ 00:10:00 ║ 15th - 14th row ║
║ 16 ║ 7034 ║ 2016-08-08 22:15:38 ║ out ║ 04:35:14 ║ ║ 16th - 15th row ║
║ 17 ║ 7034 ║ 2016-08-08 22:50:05 ║ in ║ ║ 00:34:27 ║ 17th - 16th row ║
║ 18 ║ 7034 ║ 2016-08-09 01:20:05 ║ out ║ 02:30:00 ║ ║ 18th - 17th row ║
║ 19 ║ 7034 ║ 2016-08-09 01:22:10 ║ in ║ ║ 00:02:05 ║ 19th - 18th row ║
║ 20 ║ 7034 ║ 2016-08-09 04:50:15 ║ out ║ 03:28:05 ║ ║ 20th - 19th row ║
║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ TOTAL ║ 18:12:41 ║ 02:16:20 ║ ║
╚═════════╩════════╩═════════════════════╩═══════════╩══════════╩══════════╩══════════════════╝
Können Sie die Zeile hinzufügen, '7034 | 2016-08-09 00: 01: 14.000 | zu den Tabellendaten aus und passen Sie das erwartete Ergebnis an (falls erforderlich)? – jarlh
Haben Sie Fälle von Kreuztag? Wie willst du damit umgehen? Welche Version von SQL Server verwenden Sie? – Squirrel
Ja, Cross-Day-Fälle existieren. Die Schaltzeit des Tages beginnt um 5:00 Uhr und endet um 5:00 Uhr am nächsten Tag. Ich verwende SQL Server 2012 –