2016-04-13 7 views
0

, dass Web unter Daten Angenommen:berechnen Tageszählung ohne Duplizierung

Id Start Date End Date 
1 2016-02-12 2016-02-19 
2 2016-02-15 2016-02-22 
3 2016-03-14 2016-03-20 
4 2016-03-12 2016-03-22 

ich Tag-Nummer ohne Datum Vervielfältigung berechnet werden soll. Zum Beispiel für die erste Zeile Tag zählen von Anfang bis Ende ist 8 Tage für die zweite Reihe Tag zählen von Anfang bis Ende ist 8 Tage, aber es haben 4 Tage Überschneidung mit der ersten Zeile und ich will es nicht berechnen. dritte Reihe Tag Zählung ...

+0

, was der Tag Zahl bedeutet? der Unterschied von Anfang und Ende oder etwas anderes – Sankar

+0

Ja, genau Tagesnummer – Omital

+0

Ihre Frage ist nicht sehr klar. Was meinst du mit Datumsduplikation? Bitte posten Sie die gewünschte Ausgabe. –

Antwort

1

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.

+0

Vielen Dank. Haben Sie Vorschläge für EntityFramework? – Omital

+0

Gut zu helfen :-). Ich habe noch nie mit EF gearbeitet, also nein. –

0
INSERT INTO dbo.Duration(startDate,endDate) VALUES('2007-05-06,'2007-05-07'); 
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration' FROM dbo.WhatEver; 

Rückkehr: 1

+0

Ich möchte den Tag abzählen alle Zeile in der Tabelle ohne überlappende Datum (Entschuldigung für mein schlechtes Englisch) – Omital

Verwandte Themen