Ich habe eine temporäre Tabelle, die 24 Einträge enthält, einen für jede Stunde eines bestimmten Tages, der von DayID kommentiert wird. Die Tabelle enthält eine Angabe, ob eine Anwendung während dieses bestimmten Zeitraums aktiviert oder deaktiviert ist.SQL Server: Wie man einen Datumsbereich von der Tabelle mit Anfangs- und Endezeiten erstellt
Ich möchte die Anzahl der Einträge in der Tabelle reduzieren, um nur die Zeiten anzuzeigen, in denen die Anwendung eingeschaltet sein sollte.
Einige Beispieldaten folgen:
CREATE TABLE #OnOff
(
RowID INT identity(1, 1),
DayID TINYINT,
OnOff BIT,
StartTime TIME,
EndTime TIME
)
INSERT INTO #OnOff (DayID, OnOff, StartTime, EndTime) VALUES
(1, 0, '00:00', '00:59'),
(1, 0, '01:00', '01:59'),
(1, 0, '02:00', '02:59'),
(1, 1, '03:00', '03:59'),
(1, 1, '04:00', '04:59'),
(1, 0, '05:00', '05:59'),
(1, 1, '06:00', '06:59'),
(1, 1, '07:00', '07:59'),
(1, 0, '08:00', '08:59'),
(1, 0, '09:00', '09:59'),
(1, 0, '10:00', '10:59'),
(1, 0, '11:00', '11:59'),
(1, 0, '12:00', '12:59'),
(1, 0, '13:00', '13:59'),
(1, 1, '14:00', '14:59'),
(1, 1, '15:00', '15:59'),
(1, 1, '16:00', '16:59'),
(1, 0, '17:00', '17:59'),
(1, 0, '18:00', '18:59'),
(1, 0, '19:00', '19:59'),
(1, 0, '20:00', '20:59'),
(1, 0, '21:00', '21:59'),
(1, 0, '22:00', '22:59'),
(1, 0, '23:00', '23:59')
Der gewünschte Ausgang
DayID StartTime EndTime
1 03:00 04:59
1 06:00 07:59
1 14:00 16:59
Die #OnOff Tabelle einen Wert für jede Stunde des Tages (dh Ende und Startzeiten enthalten wird es immer sein soll, werden immer hintereinander sein, außer für die letzte Stunde). Man kann das natürlich mit einem Cursor erreichen, aber das scheint ziemlich ineffizient zu sein. Gibt es einen besseren Weg, um dieses Ergebnis zu erreichen?
Ihre Frage ist nicht sehr klar. warum nicht einfach nur die Zeilen einfügen, in denen der Wert von On On 1 ist? –
Vorsicht mit den Zeitbereichen, die Sie gezeigt haben .... 'timenow <= '16: 59'' unterscheidet sich von' timenow <17: 00 'um fast eine Minute. –
@Ollie Danke deinen Kommentar ... gut bemerkt. In diesem Fall ist die Frequenz nie kleiner als 60s und kann gemanagt werden, aber ich stimme dem Prinzip zu. – Gert