T-SQL DateTime Frage.Auswahl überlappender Zeitbereiche
Ich habe eine Reihe von Zeitbereichen. Während dieser Zeitbereiche könnte es eine Reihe von überlappenden Zeitbereichen geben, die ich als "blockierte" Zeit bezeichne. Die blockierte Zeit würde nicht länger als einen Tag dauern. Was ich tun möchte, ist die Zeit zu teilen, um die blockierte Zeit auszuschließen, im Grunde geben mir die Zeitbereiche, die nicht "blockiert" sind. Es ist sicher anzunehmen, dass blockierte Zeiten nicht außerhalb der Zeitbereiche liegen können.
Beispiel: Ich arbeite 9 bis 17 Uhr mit einer 30-minütigen Mittagspause um 13 Uhr. Ich möchte das Ergebnis von 2 Zeilen: 9 bis 13 und 13:30 bis 17 Uhr.
Wie bereits erwähnt, habe ich eine Reihe von Zeitbereichen. Im obigen Beispiel können die Arbeitszeiten daher täglich abweichen und die Anzahl der Pausen sowie deren Dauer variieren.
Ich denke, in Bezug auf die SQL die Eingabeparameter wie folgt aussehen würde:
declare @timeranges table (StartDateTime datetime, EndDateTime datetime)
declare @blockedtimes table (StartDateTime datetime, EndDateTime datetime)
insert into @timeranges
select '01 Jan 2009 09:00:00', '01 Jan 2009 17:00:00'
union select '02 Feb 2009 10:00:00', '02 Feb 2009 13:00:00'
insert into @blockedtimes
select '01 Jan 2009 13:00:00', '01 Jan 2009 13:30:00'
union select '02 Feb 2009 10:30:00', '02 Feb 2009 11:00:00'
union select '02 Feb 2009 12:00:00', '02 Feb 2009 12:30:00'
Die Ergebnismenge wird wie folgt aussehen würde.
Start End
--------------------- ---------------------
'01 Jan 2009 09:00:00' '01 Jan 2009 13:00:00'
'01 Jan 2009 13:30:00' '01 Jan 2009 17:00:00'
'02 Feb 2009 10:00:00' '02 Feb 2009 10:30:00'
'02 Feb 2009 11:00:00' '02 Feb 2009 12:00:00'
'02 Feb 2009 12:30:00' '02 Feb 2009 13:00:00'
Ich konnte dies mit einem Cursor oder while-Schleife, aber wenn jemand könnte vorschlagen, wie dies ohne Iteration zu tun, das wäre toll - danke.
Dies hat komm vorher. –
@Daniel A. White: Ich kann es nicht finden, kümmern sich um einen Link zu teilen? –
Ich konnte keine Antwort finden, weshalb ich die Frage gestellt habe. –