Unter der Annahme, dass Sie 1/21 statt 2/21 zu schreiben bedeuten, hier ist ein Weg, es zu tun:
with dates as
(
select '2016-01-15' as dtStart, '2016-01-20' as dtEnd union all
select '2016-02-12', '2016-03-15' union all
select '2016-03-21', '2016-04-11'
),
calcs as
(
select
dateadd(day, 1, dtEnd) as rangeStart,
(select dateadd(day, -1, min(dtStart))
from dates d2 where d2.dtStart > d.dtEnd) as rangeEnd
from dates d
)
select *
from calcs c
where c.rangeEnd >= c.rangeStart
Die Tabelle dates
ist nur drei Reihen von Probendaten. In der calcs
Tabelle ist die rangeStart
Spalte am nächsten Tag nach jedem dtEnd
. Die Spalte rangeEnd
nimmt die nächste dtStart
und subtrahiert einen Tag. Schließlich hat die letzte Zeile eine Null, da jetzt nach dem letzten dtEnd ein Bereich fehlt. Daher ignoriere ich die Zeile mit dem Nullwert rangeEnd
.
Bearbeiten: Wenn Sie mit der with
Anweisung in meinem Code nicht vertraut sind, ist es ein CTE. Ich habe es hier verwendet, um schnell eine Tabelle mit einigen Beispieldaten (Datumsangaben) und einem Speicherort für Berechnungen (Berechnungen) zu erstellen.
Edit2: Da Sie erwähnt eine in Ihrem Kommentar verbinden mit, hier ist ein Weg, dies zu tun:
with dates as
(
select '2016-01-15' as dtStart, '2016-01-20' as dtEnd union all
select '2016-02-12', '2016-03-15' union all
select '2016-03-21', '2016-04-11'
),
calcs as
(
select
dateadd(day, 1, d1.dtEnd) as rangeStart,
dateadd(day, -1, min(d2.dtStart)) as rangeEnd
from dates d1
join dates d2 on d1.dtEnd < d2.dtStart
group by d1.dtEnd
)
select *
from calcs
where datediff(day, rangeStart, rangeEnd) >= 0
Edit3:
in Ausgabe ich glaube, Sie 1/21 bis 2/11 brauchen ... ist es richtig ? – Bhaarat
Haben Sie in Ihrer Beispielausgabe 1/21 anstelle von 2/21 geschrieben? – user2023861
Müssen Sie auch das Jahr zum Datum hinzufügen? – DVT