n4426
Goto Top

Monate zwischen zwei Datumsfeldern anzeigen (als Abfrage)

Access XP u. Access 2007

Hallo,

ich sitzt jetzt schon den ganzen tag dran, on komm nicht wirklich auf eine Lösung.

Ich hab eine Tabelle mit den Personendaten (in dieser Form).

ID Nachname Vorname Eintritt Austritt
1 Mustermann Max 01.02.2008 30.09.2008
2 Musterfrau Maxim 01.06.2008 31.03.2009
3 Mustermann Herbert 15.10.2008


Jetzt möchte ich eine Abfrage erstellen, wo dann folgendes Ergebnis raus kommt. (Beim aktuellen Monat (momentan 2008/12) wird aufgehört)

Nachname Vorname Jahr Monat
Mustermann Max 2008 02
Mustermann Max 2008 03
Mustermann Max 2008 04
Mustermann Max 2008 05
Mustermann Max 2008 06
Mustermann Max 2008 07
Mustermann Max 2008 08
Mustermann Max 2008 09
Musterfrau Maxim 2008 06
Musterfrau Maxim 2008 07
Musterfrau Maxim 2008 08
Musterfrau Maxim 2008 09
Musterfrau Maxim 2008 10
Musterfrau Maxim 2008 11
Musterfrau Maxim 2008 12
Mustermann Herbert 2008 10
Mustermann Herbert 2008 11
Mustermann Herbert 2008 12

Es sollen also sämtliche Monate angezeigt werden, die zwischen den beiden Datumfeldern Eintritt und Austritt liegen.

Wenns wie oben dargestellt nicht geht, währe es auch so in der art möglich. (Trennzeichen kann auch ein anderes sein).
Nachname Vorname JahrMonat
Mustermann Max 2008/02
Mustermann Max 2008/03
Mustermann Max 2008/04
Mustermann Max 2008/05
Mustermann Max 2008/06
Mustermann Max 2008/07
Mustermann Max 2008/08
Mustermann Max 2008/09
Musterfrau Maxim 2008/06
Musterfrau Maxim 2008/07
Musterfrau Maxim 2008/08
Musterfrau Maxim 2008/09
Musterfrau Maxim 2008/10
Musterfrau Maxim 2008/11
Musterfrau Maxim 2008/12
Mustermann Herbert 2008/10
Mustermann Herbert 2008/11
Mustermann Herbert 2008/12


Hat da einer von euch eine Idee, wie man das über eine abfrage realisieren kann?

Vielen Dank für eure hilfe.

mfg
andi

Content-Key: 103561

Url: https://administrator.de/contentid/103561

Printed on: May 22, 2024 at 03:05 o'clock

Member: Biber
Biber Dec 08, 2008 at 20:26:11 (UTC)
Goto Top
Moin andi,

es gibt mehrere Möglichkeiten... wie im richtigen Leben.
Für die mit Abstand schnellste und Wartbarste halte ich Folgende:

1) lege Dir eine 2-Felder-Tabelle "DateDim" für Deine DatumsDimensionen "Jahr" (als Zahl) und "Monat" (als Zahl) an.
PrimaryKey ist die Kombination Jahr+Monat.
2) hack Deine paar Datensätze rein, so dass Du folgendes Ergebnis erzeugen kannst:
SELECT DateDim.Jahr, DateDim.Monat
FROM DateDim;
Jahr	Monat
2008	1
2008	2
2008	3
2008	4
2008	5
2008	6
2008	7
2008	8
2008	9
2008	10
2008	11
2008	12
2009	1
3) Dann führt Dich eine halbe Minute später dieses Statement zumindest in die Nähe des Ziels:
SELECT M.Nachname, M.Vorname, d.monat, d.jahr, m.austritt, dateSerial(d.jahr, d.monat, 1) as ds
FROM mitglieder m, datedim d
WHERE
 DateSerial( d.jahr, d.monat,1  ) > m.Eintritt
AND
(Iif (m.Austritt is null, (1=1), DateSerial( d.jahr, d.monat+1, 1 )-1 < m.austritt) )

ORDER by 1,2,4,3 

Ausgabe:
Nachname	Vorname	monat	jahr	austritt	ds
Musterfrau	Maxim	7	2008	31.03.09	01.07.08
Musterfrau	Maxim	8	2008	31.03.09	01.08.08
Musterfrau	Maxim	9	2008	31.03.09	01.09.08
Musterfrau	Maxim	10	2008	31.03.09	01.10.08
Musterfrau	Maxim	11	2008	31.03.09	01.11.08
Musterfrau	Maxim	12	2008	31.03.09	01.12.08
Musterfrau	Maxim	1	2009	31.03.09	01.01.09
Mustermann	Herbert	11	2008		01.11.08
Mustermann	Herbert	12	2008		01.12.08
Mustermann	Herbert	1	2009		01.01.09
Mustermann	Max	3	2008	30.09.08	01.03.08
Mustermann	Max	4	2008	30.09.08	01.04.08
Mustermann	Max	5	2008	30.09.08	01.05.08
Mustermann	Max	6	2008	30.09.08	01.06.08
Mustermann	Max	7	2008	30.09.08	01.07.08
Mustermann	Max	8	2008	30.09.08	01.08.08
Sorry, gerade keine Ruhe zum Schön-Formatieren
[Edit: Monate Feb 2009 und märz2009 hab ich nicht in "meiner" Datedim. Deshalb fehlen die hier.]
Is' nich' nobelpreisverdächtig, aber Du bist noch heute zum Essen zu Hause....

Grüße
Biber
Member: n4426
n4426 Dec 09, 2008 at 06:21:45 (UTC)
Goto Top
Morgen Biber,

super, Danke. Ich hab nur noch eine kleinichkeit im ditten Teil verändern müssen:


SELECT M.Nachname, M.Vorname, d.monat, d.jahr,
m.austritt, dateSerial(d.jahr, d.monat, 1) as ds
FROM mitglieder m, datedim d

WHERE DateSerial( d.jahr, d.monat,1  ) >= m.Eintritt AND (Iif (m.Austritt is null, (1=1), DateSerial( d.jahr, d.monat+1, 1 )-1 <= m.austritt) )

ORDER by 1,2,4,3 

Ohne die Tabelle mit Jahr und Monat gehts nicht, oder? (Ist hold blöd, wenn man die immer pflegen muss (aber das läst sich ja auch automatisieren))

mfg
andi
Member: jato11
jato11 Dec 09, 2008 at 11:33:51 (UTC)
Goto Top
Hallo Andi,
die Lösung hat dir Biber ja schon gegeben, aber
mich würde interessieren welchem Zweck das dient.
Bei 100 Namen könnte das ein paar Seiten Papier ergeben.
Normalerweise reicht doch die Anzahl der Monate zwischen
zwei Tagen, oder?

Viele Grüße
Torsten
Member: n4426
n4426 Dec 09, 2008 at 15:18:24 (UTC)
Goto Top
Hi Torsten,

es ist nicht zum ausdrucken gedacht, sondern um eine Auswertung zu fahren, ob jemand vergessen hat seine Monatlichen einträge in eine Datenbank zu machen.

mfg
andi
Member: Biber
Biber Dec 09, 2008 at 21:09:37 (UTC)
Goto Top
Moin n4426,

Ohne die Tabelle mit Jahr und Monat gehts nicht, oder?

Doch, natürlich. Alles außer Brotschneiden geht.
Sind doch letztlich nur ein paar Nullen und Einsen, die in sinnvoller Reihenfolger angeordnet werden müssen.

ABER: (auf die Gefahr, dass ich mich wiederhole, ich habe es im letzten Kommentar schon in etwa genauso formuliert)

Die gepostete Strategie
  • lässt sich innerhalb von Sekunden gedanklich skizzieren und nachvollziehen
  • innerhalb von 10 Minuten implementieren (zumindest der proof-of-concept-Teil)
  • innerhalb von 1 Stunde "produktiv" einsetzen
  • hat übers Jahr gesehen für die Pflege der DateDim-Tabelle einen täglichen Wartungsaufwand von einmal Kaffee-Umrühren
  • und kann im Falle Deiner Beförderung ohne Bedenken von der pummeligen Praktikantin aus dem Dritten weitergepflegt werden...

Also WTF willst Du lieber eine unwartbare Pivot-Auswertung oder ein 87-Zeilen-Statement mit vier Subselects oder eine Stored Procedure mit einem 3-Stündigen Erstellungsaufwand statt dessen haben???

Falls diese DateDim-Tabelle mit ihren 2 Feldern und paar Dutzend Sätzen Deine Access-MDB hart ans Limit bringt....das täte mir Leid, aber dann ists eh Schicht mit komplexeren Statements.

Wohl gemerkt, ich bin der Meinung, dass man/frau ziemlich alles programmieren kann.
Aber nicht alles programmieren muss.

Grüße
Biber