Verjaardag in bepaalde periode

Status
Niet open voor verdere reacties.

JeffVDB

Gebruiker
Lid geworden
25 aug 2009
Berichten
106
Hallo, ik zit met volgend probleem: ik probeer de verjaardagen van mensen te vinden via een query. Deze verjaardag moet vallen binnen 2 perioden (begin- (=Van) en einddatum (=Tot)). Ik gebruik daar volgende code voor :
SELECT deelnemers.MNUMMER, [vdag] & "/" & [vmaand] & "/" & [vjaar] AS Geboren, DateSerial(Year(Date()),Month([Geboren]),Day([Geboren])) AS Verjaart, Mid([Mnummer],1,2) AS vjaar, Mid([Mnummer],3,2) AS vmaand, Mid([Mnummer],5,2) AS vdag
FROM deelnemers
WHERE (((DateSerial(Year(Date()),Month([Geboren]),Day([Geboren]))) Between [Van] And [Tot]))
ORDER BY Mid([Mnummer],1,2), Mid([Mnummer],3,2), Mid([Mnummer],5,2);
MNUMMER = het nationaal nummer (geboortedatum omgekeerd, codes) wordt gebruikt als sleutel (dit nummer is uniek) en om te vermijden dat er dubbele info in de tabel ingebracht wordt.
Zolang de periode Van - Tot in dezelfde maand valt, krijg ik alle verjaardagen. :D
Probleem doe zich voor als er 2 opeenvolgende maanden betrokken zijn.:evil:
Iemand een oplossing?
 
Vreemd dat je voor Verjaart wél DateSerial gebruikt, en voor Geboort niet... Daarnaast zijn de veldjes vmaand etc ook niet nodig. En je sortering is toch ook gewoon het veld MNummer? Code ziet er overigens beter uit als je hem opmaakt met de CODE knop, en niet met de QUOTE.
Code:
SELECT MNUMMER, DateSerial(Val(Mid([Mnummer],1,2)),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))) AS Geboren, DateSerial(Year(Date()),Month([Geboren]),Day([Geboren])) AS Verjaart 
FROM deelnemers
WHERE (((DateSerial(Year(Date()),Month([Geboren]),Day([Geboren]))) Between [Van] And [Tot]))
ORDER BY MNUMMER
Ook deze aanpassing zal niet verklaren waarom je filtering niet werkt, maar dat komt omdat ik niet kan zien waar de velden Van en Tot vandaan komen.
 
Beste,

Ik kan maar niet begrijpen waarom bij de uitvoering van de query, de parameter Geboren wordt gevraagd.
Code:
SELECT deelnemers.MNUMMER, DateSerial(Val(Mid([Mnummer],1,2)),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))) AS Geboren, DateSerial(Year(Date()),Month([Geboren]),Day([Geboren])) AS Verjaart
FROM deelnemers
WHERE (((DateSerial(Year(Date()),Month([Geboren]),Day([Geboren]))) Between [Forms]![frmZoekVerjaardag]![txtStart1] And [Forms]![frmZoekVerjaardag]![txtEnd1]))
ORDER BY deelnemers.MNUMMER;
De Velden Van en Tot zijn uiteraard de begin- en einddatum van de periode, komend uit de TblReizen
 
Het veld [Geboren] bestaat nog niet op het moment dat je de waarde ervan nodig hebt in [Verjaart]. En dan beschouwt Access het veld als een lege parameter, en vraagt hij om een waarde. Maar je hoeft [Geboren] ook helemaal niet te gebruiken, want je kunt net zo goed de maand en dag uit Mnummer halen, zoals je bij [Geboren] ook doet.
Code:
SELECT MNUMMER, DateSerial(Val(Mid([Mnummer],1,2)),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))) AS Geboren, DateSerial(Year(Date()),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))) AS Verjaart
FROM deelnemers
WHERE (((DateSerial(Year(Date()),Month([Geboren]),Day([Geboren]))) Between [Forms]![frmZoekVerjaardag]![txtStart1] And [Forms]![frmZoekVerjaardag]![txtEnd1]))
ORDER BY MNUMMER;
 
Octafish,

Ik blijf helaas beroep doen op je kennis. Kun je mij uitleggen waarom dit gebeurt :
MNUMMER Geboren Verjaart
620531 233M76 31/05/1962 31/05/2014
400115 075M30 15/01/1940 15/01/2014
210410 042 30 10/04/2021 10/04/2014
261020 082M30 20/10/2026 20/10/2014
360624 150M24 24/06/1936 24/06/2014
440414 055M88 14/04/1944 14/04/2014
321023 132M16 23/10/1932 23/10/2014
301108 016M62 08/11/1930 08/11/2014
730429 015M93 29/04/1973 29/04/2014
260702 108M38 02/07/2026 02/07/2014
701006 257M35 06/10/1970 06/10/2014
Dit zijn slechts enkele voorbeelden. Waarom wordt bij sommigen het millennium 19 en bij anderen 20 toegevoegd?
 
Kijk eens hoe je het jaar samenstelt; dat doe je op basis van 2 cijfers. Hoe moet Access weten welke eeuw daarbij hoort? Standaard zal Access dus de huidige eeuw, doen, tenzij het kan deduceren dat de datum buiten een bepaald bereik ligt, en er vermoedelijk naar de vorige eeuw wordt verwezen. Waar dat kantelpunt ligt weet ik trouwens niet. Ergens tussen 301108 en 210410 zo te zien, want 301108 is 1930, en 210410 is 2021. Mag je zelf uitzoeken :). Beter is het natuurlijk om een code op basis van een jaartal van 4 cijfers te maken, dan heb je dit 'millenium' probleem niet. (Ja, hij bestaat echt: het 'millenium' probleem ;) )
 
Heb net een testje gedaan, en het kantelpunt ligt nu bij 1930. Of dat dan een bereik is van 16 jaar, zodat het volgend jaag 1931 is, of een vaste waarde van 1930 (waar ik toe neig,want ik ben 1930 wel vaker als kanteljaar tegengekomen in het verleden) durf ik niet te zeggen. Maar je zou er met je formule dus rekening mee moeten houden.
 
Octafish,

Ik heb op deze manier opgelost :
Geboren: FormatDateTime(Val(Mid([Mnummer];5;2)) & "/" & Val(Mid([Mnummer];3;2)) & "/19" & Val(Mid([Mnummer];1;2));2)
Is deze manier niet al te orthodox?
 
Had ook gewoon met de DateSerial gekund. Format opdrachten zet volgens mij een veld om naar tekst, en DateSerial is echt een datumcommando.
 
Octfish,

De oplossing is gevonden, nl:
Code:
SELECT tblReizen.Omschrijving AS txtOmschr, [tblReizen]![Reisjaar] & "-" & [tblReizen]![Reissoort] AS CMReis, tblReizen.Van, tblReizen.Tot, tblArchiefAll.FamNaam, IIf([Roepnaam]<>"",[Roepnaam],[Voornaam]) AS TxtVoornaam, tblArchiefAll.KAMER, tblArchiefAll.TypeDLN, Int((Date()-DateValue([Geboren]))/365.25) AS Leeftijd, tblArchiefAll.MNUMMER, FormatDateTime(Val(Mid([Mnummer],5,2)) & "/" & Val(Mid([Mnummer],3,2)) & "/19" & Val(Mid([Mnummer],1,2)),2) AS Geboren, FormatDateTime(DateSerial(Year(Date()),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))),2) AS Verjaart
FROM tblReizen INNER JOIN tblArchiefAll ON (tblReizen.REISJAAR = tblArchiefAll.REISJAAR) AND (tblReizen.REISSOORT = tblArchiefAll.REISSOORT)
WHERE ((([tblReizen]![Reisjaar] & "-" & [tblReizen]![Reissoort])=[Forms]![frmZoekVerjaardag]![txtCMReis]) AND ((FormatDateTime(DateSerial(Year(Date()),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))),2))>=[Van] And (FormatDateTime(DateSerial(Year(Date()),Val(Mid([Mnummer],3,2)),Val(Mid([Mnummer],5,2))),2))<=[Tot]))
ORDER BY tblArchiefAll.KAMER, tblArchiefAll.MNUMMER;
Alles werkt en dus beschouwt ik de vraag als opgelost. Bedankt voor je moeite en inzet.
 
Maar waarom je FormatDateTime combineert met DateSerial is mij een raadsel :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan