Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Monatsauswertung mit Datumsbereich/Monatsangabe

Begonnen von nimora, März 19, 2019, 09:50:21

⏪ vorheriges - nächstes ⏩

nimora

Hallo,

ich weiß, der Titel ist nicht unbedingt aussagekräftig aber mir fällt es schwer, das Thema in wenige Worte zu packen.

Ich führe eine Abwesenheitstabelle. Ich möchte mittels Abfrage eine Monats-Übersicht der Tage ausgegeben haben, an denen Personen nicht da waren. Nun kann es vorkommen, dass jemand in den letzten Tagen eines Monats abwesend ist und die Abwesenheit auch in den neuen Monat hineingeht. Ich möchte zum einen diese Personen mit in der Liste haben und im Idealfall auch nur die Tage, die den jeweiligen Monat betreffen. Ich verwende in der Datenbank zwei Felder, eines für den Start der Abwesenheit und eines für das Ende der Abwesenheit.

Bisher verwende ich eine manuelle Definition der Zeiträume mittels AND und OR Kombinationen, sodass ich auch Zeiträume, die aus dem Vormonat in den aktuellen Monat hineingehen, inkludiere:

WHERE (((TblAbwesenheit.Abwesenheitart)=2) AND ((TblAbwesenheit.StartDatum)<#2/1/2019#) AND ((TblAbwesenheit.EndDatum)>#1/31/2019#)) OR (((TblAbwesenheit.Abwesenheitart)=2) AND ((TblAbwesenheit.StartDatum)>#1/31/2019#) AND ((TblAbwesenheit.EndDatum)<#3/1/2019#)) OR (((TblAbwesenheit.Abwesenheitart)=2) AND ((TblAbwesenheit.StartDatum)<=#2/28/2019#) AND ((TblAbwesenheit.EndDatum)>=#3/1/2019#))

Das empfinde ich aber als etwas mühselig, das jeden Monat neu anzugeben.

Gibt es da ggf. eine elegantere Lösung, in der man lediglich den gewünschten Monat festlegt und dass alle Abwesenheitstage diese Monats (und eben auch die, die schon im Vormonat begonnen haben, gezählt aber erst ab dem 1. des Monats) enthalten sind?

Vielen Dank

ebs17

Man kann so vorgehen:
Man erstellt sich eine Kalendertabelle, für diese Nutzung und viele weitere.
Verwendung dann:
PARAMETERS
   [@PeriodStart] Date,
   [@PeriodEnd] Date;
SELECT
   A.PersonID,
   C.calDay,
   C.calMonthOfDay,
   C.calYearOfDay
FROM
   (
      SELECT
         calDay,
         calMonthOfDay,
         calYearOfDay
      FROM
         tblCalendar
      WHERE
         calDay BETWEEN [@PeriodStart] AND [@PeriodEnd]
   ) AS C,
   tblAbwesenheiten AS A
WHERE
   C.calDay BETWEEN A.StartDatum
      AND
   A.EndDatum

Durch die Parameter [@PeriodStart] und [@PeriodEnd] gibst Du Beginn und Ende der gewünschten Betrachtung an, das kann ein Monat sein, durchaus aber auch mehrere.
Die Felder calMonthOfDay und calYearOfDay werden hier nur mitgeführt, um bspw. nach Monaten gruppieren zu können und darüber die Anzahl der Tage ermitteln zu können.
Mit freundlichem Glück Auf!

Eberhard