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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top