Access 2010 Abfrage erster Werktag
Liebe Gemeinde,
wie oben bereits beschrieben bräuchte ich einen Filter bzw. Kriterium für ein Datumsfeld(oder einen VBA Code den ich garantiert nicht alleine hinkriege):
1. Abfrage: erster Werktag des aktuellen Monats
2. Abfrage: fünfter Werktag des aktuellen Monats
Bis jetzt hätte ich das Ganze mit SELECT TOP 1 und einer Wochentags Bedingung gelöst(2= Montag, 6= Freitag), bei zb. diesen Monat führt dies aber zu Problemen da der erste Montag der 05.09 und der erste Freitag der 02.09 ist.
Ziel dieser Abfrage soll eine Hochrechnung werden, die aus der Differenz der ersten 5 Werktage einen Wert ermittelt(quasi aus den ersten 5 Werktagen des Monats).
Jetzt nimmt er die Daten von Fr-(02.09) bis MO(05.09), sprich aus 4 Tagen, wobei 2 davon keine Werktage sind=keine Daten vorhanden.
SQL CODE der beiden querys(Query1):
Query 2:
Bitte um Hilfe!
Vielen Dank!
Gruß
Dr.
wie oben bereits beschrieben bräuchte ich einen Filter bzw. Kriterium für ein Datumsfeld(oder einen VBA Code den ich garantiert nicht alleine hinkriege):
1. Abfrage: erster Werktag des aktuellen Monats
2. Abfrage: fünfter Werktag des aktuellen Monats
Bis jetzt hätte ich das Ganze mit SELECT TOP 1 und einer Wochentags Bedingung gelöst(2= Montag, 6= Freitag), bei zb. diesen Monat führt dies aber zu Problemen da der erste Montag der 05.09 und der erste Freitag der 02.09 ist.
Ziel dieser Abfrage soll eine Hochrechnung werden, die aus der Differenz der ersten 5 Werktage einen Wert ermittelt(quasi aus den ersten 5 Werktagen des Monats).
Jetzt nimmt er die Daten von Fr-(02.09) bis MO(05.09), sprich aus 4 Tagen, wobei 2 davon keine Werktage sind=keine Daten vorhanden.
SQL CODE der beiden querys(Query1):
SELECT TOP 1 Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Wochenstunden.Korridorstunden AS Korridor, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage] AS Hochrechnung, Datentage.Arbeitstage, Wochenstunden.Korridorstunden
FROM ((Korridor_Daten INNER JOIN Rohdaten ON Korridor_Daten.OrgEinh = Rohdaten.[OrgEinh#]) INNER JOIN Wochenstunden ON Korridor_Daten.PersNr = Wochenstunden.PersNummer) INNER JOIN Datentage ON Korridor_Daten.Periode = Datentage.Datum
WHERE (((Weekday([Periode]))=6) AND ((Month([Periode]))=Month(Date())) AND ((Year([Periode]))=Year(Date())))
GROUP BY Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage], Datentage.Arbeitstage, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden
HAVING (((Rohdaten.[DM Bereich])=[Formulare]![frm_DM]![txtOrgEinh]) AND (((([Anzahl]-[Korridorstunden])/5)*[Arbeitstage])>0))
ORDER BY Korridor_Daten.Periode;
Query 2:
SELECT TOP 1 Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Wochenstunden.Korridorstunden AS Korridor, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage] AS Hochrechnung, Datentage.Arbeitstage, Wochenstunden.Korridorstunden
FROM ((Korridor_Daten INNER JOIN Rohdaten ON Korridor_Daten.OrgEinh = Rohdaten.[OrgEinh#]) INNER JOIN Wochenstunden ON Korridor_Daten.PersNr = Wochenstunden.PersNummer) INNER JOIN Datentage ON Korridor_Daten.Periode = Datentage.Datum
WHERE (((Weekday([Periode]))=2) AND ((Month([Periode]))=Month(Date())) AND ((Year([Periode]))=Year(Date())))
GROUP BY Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage], Datentage.Arbeitstage, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden
HAVING (((Rohdaten.[DM Bereich])=[Formulare]![frm_DM]![txtOrgEinh]))
ORDER BY Korridor_Daten.Periode;
Bitte um Hilfe!
Vielen Dank!
Gruß
Dr.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 315809
Url: https://administrator.de/contentid/315809
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
10 Kommentare
Neuester Kommentar
In MSSQL würde das hier eventuell helfen:
Wenn du jetzt aus getdate() dein Datum machst würdest du eigentlich immer den ersten Werktag des Monats aus dem Datum bekommen.
Ob die Datums-Funktionen in Access alle gleich lauten weiß ich nicht aber es könnte sich übersetzen lassen.
SELECT ( CASE datepart(dw,dateadd(month,datediff(month,0,getdate()),0)) WHEN 1 THEN getdate()+1 WHEN 6 THEN getdate()+2 ELSE getdate() END )
Ob die Datums-Funktionen in Access alle gleich lauten weiß ich nicht aber es könnte sich übersetzen lassen.
Moin Dr.Conwallis,
denkst du da nicht zu kompliziert mit den ersten Montagen und Freitagen des Monats?
In deinem Dateinkontext müsste es doch immer nur um die ersten 5 Tage des relevanten Monats gehen, für die auch Daten vorliegen.
Egal, ob der 1. der Monats an einem Dienstag, Freitag oder einem Donnerstag ist.
Also bau doch in deine Komplett-Query anstatt der obiger Querys eine Datumsgrenze ein
Ungetestet natürlich
Die ersten 5 tatsächlich vorhandenen Tage sind valider herauszufieseln als die 5 ersten Arbeitstage unter Berücksichtung von Ostermontag und regional unterschiedlich gehandhabten Feiertagen.
Grüße
Biber
denkst du da nicht zu kompliziert mit den ersten Montagen und Freitagen des Monats?
In deinem Dateinkontext müsste es doch immer nur um die ersten 5 Tage des relevanten Monats gehen, für die auch Daten vorliegen.
Egal, ob der 1. der Monats an einem Dienstag, Freitag oder einem Donnerstag ist.
Also bau doch in deine Komplett-Query anstatt der obiger Querys eine Datumsgrenze ein
SELECT
( irgendwas von Korridor_Daten)
....
WHERE Korridor_Daten.Periode IN
( Select TOP 5 x.Periode From
(SELECT Distinct Periode from Korridor_Daten
Where month(periode) = month(date())
And year(periode) = year(date())
) as x
Order by 1
)
AND ... (deine anderen WHERE-Kriterien, falls gegeben)
.....
Die ersten 5 tatsächlich vorhandenen Tage sind valider herauszufieseln als die 5 ersten Arbeitstage unter Berücksichtung von Ostermontag und regional unterschiedlich gehandhabten Feiertagen.
Grüße
Biber
Moin Dr. Cornwallis,
ja nee, überzeugt hast du mich überhaupt nicht mit der TOP 1/TOP 5-Mimik.
Kann doch nicht sein, dass so eine halbseitige Abfrage mit GROUP BY und TOP 1 nötig ist, um den ersten Werktag des Monats rauszufieseln und eine weitere separate Query gleichen Umfangs für den 5ten Werktag.
Aber gut, so fit bin ich nicht in SQL.
Wenn ich denn den ersten bzw 5. Werktag des aktuellen Monats in deiner Korridor_daten finden sollte mit SQL-Mitteln wäre das:
Der kleinste Datumswert des aktuellen Monats.... was soll da schiefgehen?
Wie gesagt, ich sehe aber keinen Bedarf für die 2 Extra-Querys.
Diese beiden Tage bzw. das SQL für deren Ermittlung kannst du doch direkt in dein Statement zur Berechnung der 5-Tage-Summierung einbauen:
Aber in meinem Kommentar oben habe ich doch gezeigt, dass du gar nicht den ersten Werktag namentlich kennen musst - es reichen doch die ersten 5 Werktage OHNE die Information, wie der erste und der fünfte nun heisst.
Grüße
Biber
[Edit] Die Statements sind ungetestet - ob alle Klammern paarig sind... weiss ich nicht.
Ein paar überflüssige habe ich noch rausgelöscht, aber evtl ist Nacharbeit nötig. [/Edit]
ja nee, überzeugt hast du mich überhaupt nicht mit der TOP 1/TOP 5-Mimik.
Kann doch nicht sein, dass so eine halbseitige Abfrage mit GROUP BY und TOP 1 nötig ist, um den ersten Werktag des Monats rauszufieseln und eine weitere separate Query gleichen Umfangs für den 5ten Werktag.
Aber gut, so fit bin ich nicht in SQL.
Wenn ich denn den ersten bzw 5. Werktag des aktuellen Monats in deiner Korridor_daten finden sollte mit SQL-Mitteln wäre das:
- Erster vorhandener Werktag des aktuellen Monats:
SELECT min(periode) as Werktag1DesMonats
From Korridor_daten
WHERE ( Month(Periode)=Month(Date() AND Year(Periode)=Year(Date() )
- Fünfter vorhandener Werktag des aktuellen Monats:
Select max(periode) as Tag5desMonats FROM (
SELECT TOP 5 Periode From (
SELECT distinct periode as periode
From Korridor_daten
WHERE ( Month( Periode)=Month(Date() AND Year(Periode)=Year(Date() )
) as alleTageDesMonats
ORDER BY periode
) as dieTop5
Wie gesagt, ich sehe aber keinen Bedarf für die 2 Extra-Querys.
Diese beiden Tage bzw. das SQL für deren Ermittlung kannst du doch direkt in dein Statement zur Berechnung der 5-Tage-Summierung einbauen:
SELECT ...(deine 5-Tage-Auswertung)
FROM Korridor_daten
WHERE periode BETWEEN ( erstes Statement in Klammern )
AND (zweites Statement in Klammern)
Aber in meinem Kommentar oben habe ich doch gezeigt, dass du gar nicht den ersten Werktag namentlich kennen musst - es reichen doch die ersten 5 Werktage OHNE die Information, wie der erste und der fünfte nun heisst.
Grüße
Biber
[Edit] Die Statements sind ungetestet - ob alle Klammern paarig sind... weiss ich nicht.
Ein paar überflüssige habe ich noch rausgelöscht, aber evtl ist Nacharbeit nötig. [/Edit]
Also zwei Sachen sind mir nicht ganz klar:
1) Beinhaltet deine Tabelle nur Werktage oder auch nicht-Werktage, die dann aber nicht berücksichtigt werden dürfen?
2) Wenn du zu einem Monat z.B. 5 Tage hast
2. Monatag
3. Dienstag
9. Montag
10. Dienstag
11. Mittwoch
Suchst du dann den 2. und den 11. oder den 2. und den 6. (Freitag)?
1) Beinhaltet deine Tabelle nur Werktage oder auch nicht-Werktage, die dann aber nicht berücksichtigt werden dürfen?
2) Wenn du zu einem Monat z.B. 5 Tage hast
2. Monatag
3. Dienstag
9. Montag
10. Dienstag
11. Mittwoch
Suchst du dann den 2. und den 11. oder den 2. und den 6. (Freitag)?
Moin ukulele-7,
Berechtigte Nachfragen....
In den Monster-Selects ganz oben macht er ja einen INNER JOIN von der Korridordate.Tabelle auf eine Tabelle Arbeitstage. Wenn in der letzteren nur die zu berücksichtigen Arbeitstage stehen (in der Regel Mo-Fr), dann würden eh alle anderen Daten weggefiltert werden, z.B. wenn in der Korridor_daten Datensätze für einen Sonntag stehen.
Aber du hast Recht mit deinen Bedenken - wenn denn tatsächlich derartige Sonntags-Daten vorhanden sind, dann kommt bei meiner TOP-5-Mimik etwas Verkehrtes raus.
Grüße
Biber
Berechtigte Nachfragen....
In den Monster-Selects ganz oben macht er ja einen INNER JOIN von der Korridordate.Tabelle auf eine Tabelle Arbeitstage. Wenn in der letzteren nur die zu berücksichtigen Arbeitstage stehen (in der Regel Mo-Fr), dann würden eh alle anderen Daten weggefiltert werden, z.B. wenn in der Korridor_daten Datensätze für einen Sonntag stehen.
Aber du hast Recht mit deinen Bedenken - wenn denn tatsächlich derartige Sonntags-Daten vorhanden sind, dann kommt bei meiner TOP-5-Mimik etwas Verkehrtes raus.
Grüße
Biber
Nun mein Beispiel hat bewusst keinen Datensatz für den 1. des Beispielmonats (welches Jahr, welcher Monat ist egal). Dann scheinst du ja nicht nur nur Werktage zu haben sondern auch lückenlose Einträge aller Werktage, das ist dann schon für diesen Fall ideal.
Bibers Ansatz ist auf jedenfall richtig und du hast ja auch schon als gelöst markiert, habe ich erst gar nicht gesehen. Man muss sich natürlich im klaren sein was passiert wenn wirklich mal Datensätze fehlen, wenn das nicht vorkommen kann dann kannst du dich in jedem Fall glücklich schätzen
Bibers Ansatz ist auf jedenfall richtig und du hast ja auch schon als gelöst markiert, habe ich erst gar nicht gesehen. Man muss sich natürlich im klaren sein was passiert wenn wirklich mal Datensätze fehlen, wenn das nicht vorkommen kann dann kannst du dich in jedem Fall glücklich schätzen