Laufende Aufträge nach Uhrzeit auswerten
Hallo zusammen,
ich bräuchte bitte eure Hilfe bei der Zusammenstellung einer SQL-Abfrage. Leider komme ich selbst nicht auf den passenden Kniff.
Gegeben ist eine Tabelle mit Aufträgen. Darin sind unter anderem jeweils als Feld der Auftragsbeginn (BEGINN_Z und BEGINN_D - Also Zeit und Datum) sowie Auftragsende (ENDE_Z und ENDE_D) angegeben.
Gewünscht ist nun eine Auswertung, die über einen bestimmten Zeitraum angibt, wieviele Aufträge zu welcher Uhrzeit liefen, aufgeschlüsselt in Stundenintervalle, also 0-1Uhr, 1-2Uhr, etc.
Da Aufträge auch über Mitternacht hinweg laufen, müsste hier auch noch der Datumssprung berücksichtigt werden.
Irgendwie fehlt mir gerade die Kreativität um das Problem zu lösen.
Hat jemand von euch eine Idee?
Danke für die Hilfe im Voraus!
ich bräuchte bitte eure Hilfe bei der Zusammenstellung einer SQL-Abfrage. Leider komme ich selbst nicht auf den passenden Kniff.
Gegeben ist eine Tabelle mit Aufträgen. Darin sind unter anderem jeweils als Feld der Auftragsbeginn (BEGINN_Z und BEGINN_D - Also Zeit und Datum) sowie Auftragsende (ENDE_Z und ENDE_D) angegeben.
Gewünscht ist nun eine Auswertung, die über einen bestimmten Zeitraum angibt, wieviele Aufträge zu welcher Uhrzeit liefen, aufgeschlüsselt in Stundenintervalle, also 0-1Uhr, 1-2Uhr, etc.
Da Aufträge auch über Mitternacht hinweg laufen, müsste hier auch noch der Datumssprung berücksichtigt werden.
Irgendwie fehlt mir gerade die Kreativität um das Problem zu lösen.
Hat jemand von euch eine Idee?
Danke für die Hilfe im Voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 337113
Url: https://administrator.de/forum/laufende-auftraege-nach-uhrzeit-auswerten-337113.html
Ausgedruckt am: 06.04.2025 um 05:04 Uhr
5 Kommentare
Neuester Kommentar
Moin,
ohne jetzt konkret ein fertiges Statement ausgearbeitet zu haben, schoss mir folgender Ansatz durch den Kopf:
Die Stundenintervalle bekämest du ja mit einem group by Hour (je nach verwendeter Datenbank entsprechende Syntax einsetzen)
Wenn ich dich richtig verstehe, willst du ja dann wissen, welche Aufträge noch nicht in dieser Stunde erledigt gewesen sind, richtig?
Hier wäre dann vermutlich ein where NOT Hour(Beginn_Z)=Hour(ENDE_Z)
Das Tagesdatum müsste glaube ich irrelevant sein...
€dit:
Es könnte so aussehen (ungetestet)
Was hier u.U. aber ein Problem geben könnte ist, dass du in diesem Where-Konstrukt nur Aufträge siehst, die nicht am selben tag begonnen und gleichzeitig beendet wurden. Das müsste man ggf. etwas anders umschreiben; ggf. durch das Kmobinieren von Datum und Uhrzeit mittels eines neuen Feldes vom Typ Timestamp.
Ggf. haben andere ja noch eine elegantere Lösung hier...
Gruß
em-pie
ohne jetzt konkret ein fertiges Statement ausgearbeitet zu haben, schoss mir folgender Ansatz durch den Kopf:
Die Stundenintervalle bekämest du ja mit einem group by Hour (je nach verwendeter Datenbank entsprechende Syntax einsetzen)
Wenn ich dich richtig verstehe, willst du ja dann wissen, welche Aufträge noch nicht in dieser Stunde erledigt gewesen sind, richtig?
Hier wäre dann vermutlich ein where NOT Hour(Beginn_Z)=Hour(ENDE_Z)
Das Tagesdatum müsste glaube ich irrelevant sein...
€dit:
Es könnte so aussehen (ungetestet)
SELECT
Beginn_D
, HOUR(Beginn_Z) AS Stunde
FROM
YourTable
WHERE
NOT HOUR(Beginn_Z)=HOUR(Ende_Z)
AND NOT Beginn_D = Ende_D
GROUP BY
Beginn_D
, HOUR(Beginn_Z)
Was hier u.U. aber ein Problem geben könnte ist, dass du in diesem Where-Konstrukt nur Aufträge siehst, die nicht am selben tag begonnen und gleichzeitig beendet wurden. Das müsste man ggf. etwas anders umschreiben; ggf. durch das Kmobinieren von Datum und Uhrzeit mittels eines neuen Feldes vom Typ Timestamp.
Ggf. haben andere ja noch eine elegantere Lösung hier...
Gruß
em-pie
Moin BirdyB,
ich verstehe die Anforderung etwas anders als em-pie, möchte aber sichergehen, bevor ich hier unnötig Aufwand reinstecke,
Mein Verständnis:
Wenn da nun 2 Aufträge drinstünden
Auftrag; Beginn_D; Beginn_z;Ende_D;Ende_Z
4711; 05.05.2017; 17:11;05.05.2017;20:14;
4712; 05.05;2017;22:56;06.05:2017;00:17
Dann willst du eine Darstellung
05.05.2017; Von 00-01 ; 0
05.05.2017; Von 01-02 ; 0
05.05.2017; Von 17-18 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 18-19 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 19-20 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 20-21 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 21-22 ; 0
05.05.2017; Von 22-23 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
05.05.2017; Von 23-00 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
06.05.2017; Von 00-01 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
06.05.2017 Von 01-02; 0 .....
Habe ich das so richtig interpretiert?
Wenn ja, dann ist erstmal eine lückenlose Timeline zu bauen (geht im SELECT durchaus, macht es aber nicht lesbarer).
Wobei die Frage wäre, was denn der "Zeitraum" ist, der maximal betrachtet werden soll - eher die letzten 2 Tage oder die letzten 30 oder das letzte Quartal...
Blöd ist nur die Timestamp-Speicherung als Datum und Uhrzeit in separaten Feldern... wer ist denn bei euch auf diesen Bolzen gekommen?
Gib doch mal ein paar (realitätsnahe) Beispielsätze rüber. Die "Auftrags-IDs" können gerne 4711, 4711 usw heissen.
Grüße
Biber
ich verstehe die Anforderung etwas anders als em-pie, möchte aber sichergehen, bevor ich hier unnötig Aufwand reinstecke,
Mein Verständnis:
- In der Tabelle "Auftrag" (oder wie immer die bei euch heisst), gibt es Aufträge mit IDs, Start+Ende-Zeiten
- die Start- und Ende-Zeiten sind irrwitzigerweise nicht als Timestamps gespeichert, sondern jeweils als ein Feld Datum und ein Feld Uhrzeit
Wenn da nun 2 Aufträge drinstünden
Auftrag; Beginn_D; Beginn_z;Ende_D;Ende_Z
4711; 05.05.2017; 17:11;05.05.2017;20:14;
4712; 05.05;2017;22:56;06.05:2017;00:17
Dann willst du eine Darstellung
05.05.2017; Von 00-01 ; 0
05.05.2017; Von 01-02 ; 0
05.05.2017; Von 17-18 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 18-19 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 19-20 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 20-21 ; 1 ( Summe 1, denn hier lief Auftrag 4711)
05.05.2017; Von 21-22 ; 0
05.05.2017; Von 22-23 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
05.05.2017; Von 23-00 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
06.05.2017; Von 00-01 ; 1 ( Summe 1, denn hier lief Auftrag 4712)
06.05.2017 Von 01-02; 0 .....
Habe ich das so richtig interpretiert?
Wenn ja, dann ist erstmal eine lückenlose Timeline zu bauen (geht im SELECT durchaus, macht es aber nicht lesbarer).
Wobei die Frage wäre, was denn der "Zeitraum" ist, der maximal betrachtet werden soll - eher die letzten 2 Tage oder die letzten 30 oder das letzte Quartal...
Blöd ist nur die Timestamp-Speicherung als Datum und Uhrzeit in separaten Feldern... wer ist denn bei euch auf diesen Bolzen gekommen?
Gib doch mal ein paar (realitätsnahe) Beispielsätze rüber. Die "Auftrags-IDs" können gerne 4711, 4711 usw heissen.
Grüße
Biber
So könnte es gehen (ich arbeite mit einer lokalen MSSQL DB):
Das ist natürlich anpassungsfähig. Die Tabelle "test" kann aus dem WITH Teil gestrichen und durch richtige Daten ersetzt werden. Bei 24 Datensätzen pro Tag sollte man natürlich den Zeitraum nicht zu groß wählen. Vielleicht schließt man auch noch Wochenenden aus etc.
WITH test(AuftragsID,Beginn_D,Beginn_Z,Ende_D,Ende_Z,Auftragsart) AS (
SELECT 4711,'2017-04-01','22:55:00','2017-04-02','00:45:00','RTW' UNION ALL
SELECT 4712,'2017-04-02','11:31:00','2017-04-02','12:48:00','ITW' UNION ALL
SELECT 4713,'2017-04-02','12:11:00','2017-04-02','13:21:00','RTW' UNION ALL
SELECT 4714,'2017-04-02','12:44:00','2017-04-02','14:39:00','ITW'
), raster(datumzeit) AS (
SELECT convert(DATETIME,'2017-04-01 00:00:00.000',120)
UNION ALL
SELECT dateadd(hour,1,datumzeit)
FROM raster
WHERE dateadd(hour,1,datumzeit) < convert(DATETIME,'2017-05-01 00:00:00.000',120)
)
SELECT r.datumzeit,
sum(CASE WHEN t.AuftragsID IS NULL THEN 0 ELSE 1 END) AS anzahl
FROM raster r
LEFT JOIN test t
ON r.datumzeit BETWEEN convert(DATETIME,Beginn_D,120) + Beginn_Z AND convert(DATETIME,Ende_D,120) + Ende_Z
GROUP BY r.datumzeit
ORDER BY r.datumzeit
OPTION (MAXRECURSION 1000);