Ich bin mir nicht sicher, ob Sie die Anzahl der Tage für jede Zeile oder nur die Gesamtzahl der Tage wollen, so werde ich zeigen, eine Möglichkeit, beide Optionen zu erhalten:
Zunächst erstellen und Beispieltabelle füllen:
DECLARE @Table as TABLE
(
t_Id int identity(1,1),
t_start date,
t_end date
)
INSERT INTO @Table (t_start, t_end) VALUES
('2016-02-12', '2016-02-19'),
('2016-02-15', '2016-02-22'),
('2016-03-14', '2016-03-20'),
('2016-03-12', '2016-03-22')
Nun bekommen die Summe der Tage für jede Zeile, so dass sich die Anzahl der Tage, Reihe überlappt mit der vorherige Reihe, können Sie etwas tun können:
eine CTE mit LAG()
Fensterfunktion Mit Hilfe der vorherigen Reihe Enddatum zu bekommen, und ISNULL
mit dem Mindestdatumswert zu erhalten, wenn es die erste Zeile ist:
Wählen Sie aus diesem CTE mit CASE
, um zu sehen, ob der vorherige Datensatz den aktuellen überschneidet. wenn es das tut, subtrahieren die Anzahl der überlappenden Tage von der Zählung:
SELECT t_Id,
t_start,
t_end,
CASE WHEN prev_end < t_start THEN
DATEDIFF(DAY, t_start, t_end)
ELSE
DATEDIFF(DAY, t_start, t_end) - DATEDIFF(DAY, t_start, prev_end)
END As number_of_days
FROM CTE
Ergebnisse:
t_Id t_start t_end number_of_days
----------- ---------- ---------- --------------
1 2016-02-12 2016-02-19 7
2 2016-02-15 2016-02-22 3
4 2016-03-12 2016-03-22 10
3 2016-03-14 2016-03-20 -2 -- note that the prev row ends after this one.
Um die Gesamtzahl der Tage zu erhalten können Sie einfach die zweite Abfrage in einem anderen CTE wickeln und wählen sum(number_of_days)
:
;WITH CTE1 AS
(
SELECT t_Id, t_start, t_end, LAG(t_end) OVER (ORDER BY t_start) As prev_end
FROM @Table
), CTE2 As
(
SELECT t_Id,
t_start,
t_end,
CASE WHEN ISNULL(prev_end, '0001-01-01') < t_start THEN
DATEDIFF(DAY, t_start, t_end)
ELSE
DATEDIFF(DAY, t_start, t_end) - DATEDIFF(DAY, t_start, prev_end)
END As number_of_days
FROM CTE1
)
SELECT SUM(number_of_days)
FROM CTE2
das Ergebnis ist 18.
, was der Tag Zahl bedeutet? der Unterschied von Anfang und Ende oder etwas anderes – Sankar
Ja, genau Tagesnummer – Omital
Ihre Frage ist nicht sehr klar. Was meinst du mit Datumsduplikation? Bitte posten Sie die gewünschte Ausgabe. –