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
Man kann so vorgehen:
Man erstellt sich eine Kalendertabelle (https://www.ms-office-forum.net/forum/showthread.php?t=298670), 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.