2016-07-26 11 views
1

Ich kann die spezifische Antwort auf diese Frage nicht finden, aber entschuldigt, wenn es zuvor gefragt wurde.Termine zwischen zwei Daten aus einer Tabelle

Ich habe die folgende Beispieltabelle, die ich einfach gehalten habe, aber es enthält mehr Zeilen und Typen. Es wird häufig aktualisiert.

Type From       To       Qty 
1  2016-01-01 00:00:00.0000000 2016-01-03 00:00:00.0000000 30 
1  2016-01-04 00:00:00.0000000 2016-01-05 00:00:00.0000000 31 
1  2016-01-06 00:00:00.0000000 NULL       31 
2  2016-04-24 00:00:00.0000000 NULL       15 

Ich möchte jeden Tag eine Tabelle aktualisieren können (siehe unten), so zeigt es von Ihnen gewünschten Termin zwischen (einschließlich) dem Von und Um Daten. Die Menge für das relevante Datum muss bis zum heutigen Datum angezeigt werden, wo die TONULL ist.

Type Date       Qty 
1  2016-01-01 00:00:00.0000000 30 
1  2016-01-02 00:00:00.0000000 30 
1  2016-01-03 00:00:00.0000000 30 
1  2016-04-04 00:00:00.0000000 31 
1  2016-04-05 00:00:00.0000000 31 
1  2016-04-06 00:00:00.0000000 31 
1  2016-04-07 00:00:00.0000000 31 
1  .... up to today where TO is NULL 
1  2016-07-25 00:00:00.0000000 31 
2  2016-04-24 00:00:00.0000000 15 
2  .... up to today where TO is NULL 
2  2016-07-25 00:00:00.0000000 15 

Vielen Dank im Voraus für Ihre Hilfe.

+0

kalkulieren Sie 'Qty' in der Abfrage, oder diese in der Tabelle gespeichert ist? – Siyual

+0

Es ist in der Tabelle gespeichert. – Mally

Antwort

1

mit Zahlen Tisch ..

Demo Here

select b.*,qty from #test 
cross apply 
(
select dateadd(day,n,fromdate) from 
numbers 
where n<= 
case when todate is null 
then datediff(day,fromdate,getdate()) else datediff(day,fromdate,todate) end 
) b(upd) 
1

Sie können dies tun, um eine rekursive CTE mit all den Daten und JOIN zu, dass für das Ergebnis zu generieren:

Testdaten

Create Table Test 
(
    [Type] Int, 
    [From] Date, 
    [To] Date, 
    Qty  Int 
) 

Insert Test 
Values 
(1, '2016-01-01', '2016-01-03', 30), 
(1, '2016-01-04', '2016-01-05', 31), 
(1, '2016-01-06', NULL,   31), 
(2, '2016-04-24', NULL,   15) 

Abfrage

;With MinMax As 
(
    Select Min([From])     MinFrom, 
      Max([To])     MaxTo, 
      Convert(Date, GetDate()) Today 
    From Test 
), Date (Date) As 
(
    Select MinFrom 
    From MinMax 
    Union All 
    Select DateAdd(Day, 1, Date) 
    From Date 
    Where Date < (Select MaxTo From MinMax) 
    Or  Date < (Select Today From MinMax) 
) 
Select T.[Type], 
     D.[Date], 
     T.Qty 
From Test T 
Join Date D On D.Date Between T.[From] And Coalesce(T.[To], Convert(Date, GetDate())) 
Order By T.[Type], D.[Date] 
Option (MaxRecursion 0) 

Ergebnisse

Type Date  Qty 
1  2016-01-01 30 
1  2016-01-02 30 
1  2016-01-03 30 
1  2016-01-04 31 
1  2016-01-05 31 
1  2016-01-06 31 
1  2016-01-07 31 
1  2016-01-08 31 
1  2016-01-09 31 
1  2016-01-10 31 
1  2016-01-11 31 
1  2016-01-12 31 
1  2016-01-13 31 
1  2016-01-14 31 
1  2016-01-15 31 
1  2016-01-16 31 
1  2016-01-17 31 
1  2016-01-18 31 
1  2016-01-19 31 
1  2016-01-20 31 
1  2016-01-21 31 
1  2016-01-22 31 
1  2016-01-23 31 
1  2016-01-24 31 
1  2016-01-25 31 
1  2016-01-26 31 
1  2016-01-27 31 
1  2016-01-28 31 
1  2016-01-29 31 
1  2016-01-30 31 
1  2016-01-31 31 
1  2016-02-01 31 
1  2016-02-02 31 
1  2016-02-03 31 
1  2016-02-04 31 
1  2016-02-05 31 
1  2016-02-06 31 
1  2016-02-07 31 
1  2016-02-08 31 
1  2016-02-09 31 
1  2016-02-10 31 
1  2016-02-11 31 
1  2016-02-12 31 
1  2016-02-13 31 
1  2016-02-14 31 
1  2016-02-15 31 
1  2016-02-16 31 
1  2016-02-17 31 
1  2016-02-18 31 
1  2016-02-19 31 
1  2016-02-20 31 
1  2016-02-21 31 
1  2016-02-22 31 
1  2016-02-23 31 
1  2016-02-24 31 
1  2016-02-25 31 
1  2016-02-26 31 
1  2016-02-27 31 
1  2016-02-28 31 
1  2016-02-29 31 
1  2016-03-01 31 
1  2016-03-02 31 
1  2016-03-03 31 
1  2016-03-04 31 
1  2016-03-05 31 
1  2016-03-06 31 
1  2016-03-07 31 
1  2016-03-08 31 
1  2016-03-09 31 
1  2016-03-10 31 
1  2016-03-11 31 
1  2016-03-12 31 
1  2016-03-13 31 
1  2016-03-14 31 
1  2016-03-15 31 
1  2016-03-16 31 
1  2016-03-17 31 
1  2016-03-18 31 
1  2016-03-19 31 
1  2016-03-20 31 
1  2016-03-21 31 
1  2016-03-22 31 
1  2016-03-23 31 
1  2016-03-24 31 
1  2016-03-25 31 
1  2016-03-26 31 
1  2016-03-27 31 
1  2016-03-28 31 
1  2016-03-29 31 
1  2016-03-30 31 
1  2016-03-31 31 
1  2016-04-01 31 
1  2016-04-02 31 
1  2016-04-03 31 
1  2016-04-04 31 
1  2016-04-05 31 
1  2016-04-06 31 
1  2016-04-07 31 
1  2016-04-08 31 
1  2016-04-09 31 
1  2016-04-10 31 
1  2016-04-11 31 
1  2016-04-12 31 
1  2016-04-13 31 
1  2016-04-14 31 
1  2016-04-15 31 
1  2016-04-16 31 
1  2016-04-17 31 
1  2016-04-18 31 
1  2016-04-19 31 
1  2016-04-20 31 
1  2016-04-21 31 
1  2016-04-22 31 
1  2016-04-23 31 
1  2016-04-24 31 
1  2016-04-25 31 
1  2016-04-26 31 
1  2016-04-27 31 
1  2016-04-28 31 
1  2016-04-29 31 
1  2016-04-30 31 
1  2016-05-01 31 
1  2016-05-02 31 
1  2016-05-03 31 
1  2016-05-04 31 
1  2016-05-05 31 
1  2016-05-06 31 
1  2016-05-07 31 
1  2016-05-08 31 
1  2016-05-09 31 
1  2016-05-10 31 
1  2016-05-11 31 
1  2016-05-12 31 
1  2016-05-13 31 
1  2016-05-14 31 
1  2016-05-15 31 
1  2016-05-16 31 
1  2016-05-17 31 
1  2016-05-18 31 
1  2016-05-19 31 
1  2016-05-20 31 
1  2016-05-21 31 
1  2016-05-22 31 
1  2016-05-23 31 
1  2016-05-24 31 
1  2016-05-25 31 
1  2016-05-26 31 
1  2016-05-27 31 
1  2016-05-28 31 
1  2016-05-29 31 
1  2016-05-30 31 
1  2016-05-31 31 
1  2016-06-01 31 
1  2016-06-02 31 
1  2016-06-03 31 
1  2016-06-04 31 
1  2016-06-05 31 
1  2016-06-06 31 
1  2016-06-07 31 
1  2016-06-08 31 
1  2016-06-09 31 
1  2016-06-10 31 
1  2016-06-11 31 
1  2016-06-12 31 
1  2016-06-13 31 
1  2016-06-14 31 
1  2016-06-15 31 
1  2016-06-16 31 
1  2016-06-17 31 
1  2016-06-18 31 
1  2016-06-19 31 
1  2016-06-20 31 
1  2016-06-21 31 
1  2016-06-22 31 
1  2016-06-23 31 
1  2016-06-24 31 
1  2016-06-25 31 
1  2016-06-26 31 
1  2016-06-27 31 
1  2016-06-28 31 
1  2016-06-29 31 
1  2016-06-30 31 
1  2016-07-01 31 
1  2016-07-02 31 
1  2016-07-03 31 
1  2016-07-04 31 
1  2016-07-05 31 
1  2016-07-06 31 
1  2016-07-07 31 
1  2016-07-08 31 
1  2016-07-09 31 
1  2016-07-10 31 
1  2016-07-11 31 
1  2016-07-12 31 
1  2016-07-13 31 
1  2016-07-14 31 
1  2016-07-15 31 
1  2016-07-16 31 
1  2016-07-17 31 
1  2016-07-18 31 
1  2016-07-19 31 
1  2016-07-20 31 
1  2016-07-21 31 
1  2016-07-22 31 
1  2016-07-23 31 
1  2016-07-24 31 
1  2016-07-25 31 
1  2016-07-26 31 
2  2016-04-24 15 
2  2016-04-25 15 
2  2016-04-26 15 
2  2016-04-27 15 
2  2016-04-28 15 
2  2016-04-29 15 
2  2016-04-30 15 
2  2016-05-01 15 
2  2016-05-02 15 
2  2016-05-03 15 
2  2016-05-04 15 
2  2016-05-05 15 
2  2016-05-06 15 
2  2016-05-07 15 
2  2016-05-08 15 
2  2016-05-09 15 
2  2016-05-10 15 
2  2016-05-11 15 
2  2016-05-12 15 
2  2016-05-13 15 
2  2016-05-14 15 
2  2016-05-15 15 
2  2016-05-16 15 
2  2016-05-17 15 
2  2016-05-18 15 
2  2016-05-19 15 
2  2016-05-20 15 
2  2016-05-21 15 
2  2016-05-22 15 
2  2016-05-23 15 
2  2016-05-24 15 
2  2016-05-25 15 
2  2016-05-26 15 
2  2016-05-27 15 
2  2016-05-28 15 
2  2016-05-29 15 
2  2016-05-30 15 
2  2016-05-31 15 
2  2016-06-01 15 
2  2016-06-02 15 
2  2016-06-03 15 
2  2016-06-04 15 
2  2016-06-05 15 
2  2016-06-06 15 
2  2016-06-07 15 
2  2016-06-08 15 
2  2016-06-09 15 
2  2016-06-10 15 
2  2016-06-11 15 
2  2016-06-12 15 
2  2016-06-13 15 
2  2016-06-14 15 
2  2016-06-15 15 
2  2016-06-16 15 
2  2016-06-17 15 
2  2016-06-18 15 
2  2016-06-19 15 
2  2016-06-20 15 
2  2016-06-21 15 
2  2016-06-22 15 
2  2016-06-23 15 
2  2016-06-24 15 
2  2016-06-25 15 
2  2016-06-26 15 
2  2016-06-27 15 
2  2016-06-28 15 
2  2016-06-29 15 
2  2016-06-30 15 
2  2016-07-01 15 
2  2016-07-02 15 
2  2016-07-03 15 
2  2016-07-04 15 
2  2016-07-05 15 
2  2016-07-06 15 
2  2016-07-07 15 
2  2016-07-08 15 
2  2016-07-09 15 
2  2016-07-10 15 
2  2016-07-11 15 
2  2016-07-12 15 
2  2016-07-13 15 
2  2016-07-14 15 
2  2016-07-15 15 
2  2016-07-16 15 
2  2016-07-17 15 
2  2016-07-18 15 
2  2016-07-19 15 
2  2016-07-20 15 
2  2016-07-21 15 
2  2016-07-22 15 
2  2016-07-23 15 
2  2016-07-24 15 
2  2016-07-25 15 
2  2016-07-26 15 
+0

Ausgezeichnet! Vielen Dank für Ihre Antworten. Diese funktionieren perfekt. – Mally

Verwandte Themen