Subdivide Zeitstempel in 3 Zeitschlitze
Frage
Ich habe folgendes Problem, wenn ich zu einer Gruppe in Zeitschlitze verschiedenen Transaktionen haben. Angenommen, Sie eine Tabelle mit Datensätzen haben, die einen Eintrag enthalten Datetimestamp. Diese Datensätze werden von anderen Nutzern (Betreiber), die in verschiedenen Schichten arbeiten
Shift-1 : 5 - 13h // Shift 2 : 13 - 21h // Shift-3 : 21 - 5h
Jetzt möchte ich eine flexible Abfrage haben, die die Zeitstempel bis auf die Startzeit der Verschiebung rundet. Beispiel:
2010-09-08 06:12:00.000 --> 2010-09-08 05:00:00.000
2010-09-08 02:12:00.000 --> 2010-09-07 21:00:00.000
Ich habe bereits versucht, ein paar Abfragen mit dateadd und datediff aber ich verstehe es nicht zur Arbeit ... Kann jemand helfen? Dank
Lösung
Wie wäre es damit ...?
select
case
when datepart(Hh, dt) >= 5 AND datepart(Hh, dt) < 13 then 1
when datepart(Hh, dt) >= 13 AND datepart(Hh, dt) < 21 then 2
when datepart(Hh, dt) < 5 OR datepart(Hh, dt) >= 21 then 3
end
from myTable
Andere Tipps
select
case
when datepart(hh, start_date) between 5 and 12
then dateadd(hh, 5, dateadd(d, datediff(d, 0, start_date), 0))
when datepart(hh, start_date) between 13 and 20
then dateadd(hh, 13, dateadd(d, datediff(d, 0, start_date), 0))
when datepart(hh, start_date) between 21 and 23
then dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date), 0))
else dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date)-1, 0))
end
from ...
select
case
--shift I
when datepart(HH, [TimeStamp]) >= 5 and datepart(HH, [TimeStamp]) < 13 then
dateadd(HH, 5, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
--shift II
when datepart(HH, [TimeStamp]) >= 13 and datepart(HH, [TimeStamp]) < 21 then
dateadd(HH, 13, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
--shift III
when datepart(HH, [TimeStamp]) >= 21 then
dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
when datepart(HH, [TimeStamp]) < 5 then
dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])-1))
end as StartTime
from
Table1
Wenn Ihre Datenbank einen INTERVAL
Typ unterstützt, subtrahiert fünf Stunden von dem Zeitstempel des Ereignisses ihm aufreihen relativ zu Mitternacht statt 0500 und teilen den Zeitteil von 8 Stunden eine Verschiebung Zahl von Null indiziert zu erhalten.
die Schaltstartzeit zu erhalten, multiplizieren Sie die Verschiebezahl von 8 Stunden, hinzufügen, dass zu dem Zeitpunkt eines Teil der Subtraktion Sie oben haben und dann fünf weitere Stunden hinzufügen, um es mit Ihrem Schaltplan sichert auskleiden.
Wenn Sie vorhaben, diese viel zu abfragt, könnten Sie besser dran sein, eine zweite Tabelle zu erstellen, dass individuell jede Verschiebung identifiziert durch eine ID und seine Startzeit. Sie können dann die Verschiebungen Tabelle bevölkern eine ON INSERT-Trigger auf der Tabelle mit Ihrem Ereignisse enthalten, die die Berechnung einmal der Fall ist, fügt eine neue Zeile in die Tabelle der Verschiebungen bei Bedarf und bindet Ihre Veranstaltung Zeile es einen Fremdschlüssel. Das würde man auch einen viel einfacheren Weg gibt alle Ereignisse abzufragen, die während einer bestimmten Verschiebung passiert ist.