Anzahl Tage anwesend in einem Monat mit Unterbrechungszeitraum

lolman

Neuer Benutzer
Beiträge
2
Hallo,

ich habe ein Problem mit einer Abfrage und würde mich freuen, wenn mir jemand einen Tipp geben könnte, wie man das lösen kann.
Ich habe 2 Tabellen: eine mit der Anwesenheit eines Users und eine 2. mit den Abwesenheiten, jeweils als DATETIME gespeichert
Das sieht dann so aus:
Code:
Betreuungszeit
UserID   Von                           Bis
1       2018-12-17 00:00:00.000       2021-01-09 00:00:00.000
1       2021-01-12 00:00:00.000       9998-12-31 00:00:00.000


Unterbrechung
UserID   Von                           Bis
1       2021-01-05 00:00:00.000       2021-01-06 00:00:00.000
1       2021-01-14 00:00:00.000       2021-01-18 00:00:00.000


Nun möchte ich die Anzahl der Tage, die der User anwesend war für einen bestimmten Monat (zb: Januar 2021)

Ich habe jetzt erstmal sowas probiert, weiß aber noch nicht wie ich da die Unterbrechung integriere und ob Datapart überhaupt das richtige ist.
Code:
SELECT DATEDIFF(day, Von, Bis)
FROM [Betreuungszeit]
WHERE ( (DATEPART(yy, Von) < 2021 OR ( DATEPART(mm, Von) <= 1 AND DATEPART(yy, Von) = 2021))
  AND (DATEPART(yy, Bis) > 2021 OR ( DATEPART(mm, Bis) >= 1 AND DATEPART(yy, Bis) = 2021))
 
Werbung:
Ist es nur die Abfrage nach Monat? Oder auch KW oder Datumsbereich?
Dafür müsstest Du wahrscheinlich Grenzwerte festlegen / handhaben, ähnlich wie bei dem Pseudo Unendlichkeitsdatum 9998-01-01
 
Werbung:
Keine schöne Sache, bei dem Datenmodell. Wenn ich das richtig sehe, dann hat SQL Server keine Range Types, richtig?
Ja und ob die Daten plausibel sind, weiß wahrscheinlich auch niemand, mangels Constraints.

Ich habe einen Versuch, wo ich alles zerlege und sortiere, vielleicht kannst Du damit was anfangen.
Die Einschränkung auf Monate ist aber nicht drin. Vielleicht fällt Dir was dazu ein. :)

Und ich habe das Statement selbst vergessen:
Code:
select userid,
       vorigesDatum,
       datum,
       dateDiff(day, vorigesDatum, datum),
       calculate
  from (select userID, lag(datum) over(order by userid, datum) as vorigesDatum,
               datum,  lag(calculate) over(order by userid, datum) as calculate
          from (select userID, von as Datum, 1 as calculate 
                                      from betreuungszeit
                union all
                select userID,
                        case when bis > getdate() 
                        then getdate()
                        else bis
                        end,
                        0 
                  from betreuungszeit
                 union all
                select userID, von, 0 from unterbrechung
                 union all
                select userID, bis, 1 from unterbrechung
               ) rawdata
       ) steamed
 
Zuletzt bearbeitet:
Zurück
Oben