Jubileum berekenen per 1 maart

Status
Niet open voor verdere reacties.

SA3

Gebruiker
Lid geworden
3 jan 2016
Berichten
127
Als ik in een query voor het berekenen van het jubileum "Year(Date())-Year([Inschrijfdatum])" in geef in het designview, krijg ik alle jubilea van het hele jaar.
De peildatum is echter 1 maart. Alle inschrijfdata die in januari en februari vallen hebben wèl een jubileum maar de overige pas het jaar er na.
Voorbeeld: Een inschrijfdatum van 01-jan-1968 is per 1-mrt-2018 wèl een 50-jarig jubileum, maar die van b.v. 01-nov-1968 niet.

Wat moet ik doen om de juiste jubilea te berekenen?
 
Daar zijn verschillende oplossingen voor. Ik gebruik deze wel eens:
PHP:
Jubileum: Year(Date())-Year([Inschrijfdatum])-(DateSerial(Year(Date());Month([Inschrijfdatum]);Day([Inschrijfdatum]))<DateSerial(Year(Date());3;1))
 
De getallen die er nu uitkomen zijn er steeds 1 teveel. B.v. 40 moet 39 zijn, dus nog geen jubileum.
 
En zo dan?
PHP:
Jubileum: Year(Date())-Year([Inschrijfdatum])+Abs(IIf(Year([Inschrijfdatum])<Year(Date());Month([Inschrijfdatum])<3;0))
 
Dit heeft hetzelfde effect. Er komen nog steeds jubilarissen met inschrijfdata nà de peildatum als jubilaris voor dit jaar i.p.v. volgend jaar.

In de bijlage heb ik aangegeven wat de huidige en de gewenste output is.
 

Bijlagen

  • Huidige en gewenste output.pdf
    76,2 KB · Weergaven: 34
Ìk zou zeggen: een database voorbeeldje doet heel wat meer. Aan een pdf-je heb ik niet zoveel.
 
Oke. Zie bijlage.
In de query mogen Pipo3, 6 en 8 niet in 2018 genoemd worden. Zij moeten naar Jubileumjaar 2019.
 

Bijlagen

  • Jubilarissen.zip
    23 KB · Weergaven: 25
Was inderdaad een leuke; er zaten een paar variabelen in die ik niet helemaal goed had ingeschat. Dit zou moeten werken:
PHP:
SELECT Naam, Inschrijfdatum FROM Table1
WHERE (IIf((Year(Date())-Year([Inschrijfdatum])) Mod 5=0 And Year(Date())>Year([Inschrijfdatum]),IIf(Month([Inschrijfdatum])<3,True,0),0))<>False
 
Het is toch complexer.
Per jaar is de peildatum per 1-mrt. Voor 2018 is dit: 1-3-2018.
Dit betekent dat de volgende maanden meetellen voor het jubileum in 2018:
mrt-2017, apr-2017, mei-2017, jun-2017, jul-2017, aug-2017, sep-2017, oct-2017, nov-2017, dec-2017 en jan-2018, feb-2018
Voor deze inschrijfdata moet het Jubileumjaar = 2018 worden ingevuld.

Inschrijfdata die in de overige maanden (vanaf mrt-2018) van 2018 vallen hebben hun jubileum in 2019. Voor deze data moet het Jubileumjaar = 2019 worden ingevuld.
 
Ik zie alleen inschrijfdata in de maanden januari en februari.
Ik denk dat onderstaande selectie moet werken. Maar hoe te vertalen in MySQL-code?

IF
de maand van (VorigJaar- Inschrijfdatum) is mrt
OR
apr OR mei OR jun OR jul OR aug OR sep OR oct OR nov OR dec
AND
Jubileum is 25 OR 30 OR 35 OR 40 OR 45 OR 50 OR 55 OR 60
OR
de maand van (DitJaar- Inschrijfdatum) is jan OR feb
AND
Jubileum is 25 OR 30 OR 35 OR 40 OR 45 OR 50 OR 55 OR 60
THEN
is het JubileumJaar = DitJaar
ELSE
de maand van (DitJaar- Inschrijfdatum) is mrt OR apr OR mei OR jun OR jul OR aug OR sep OR oct OR nov OR dec
AND
Jubileum is 25 OR 30 OR 35 OR 40 OR 45 OR 50 OR 55 OR 60
THEN
is het JubileumJaar = VolgendJaar
FI
 
Veel meer als dit kan ik er toch niet van maken....
PHP:
Volgend Jubileum: IIf(Year([inschrijfdatum])=Year(Date());
     Year(Date())+5-(Val(Month([Inschrijfdatum])>2));
     Year(Date())+(5-(Val(Replace((Year(Date())-Year([Inschrijfdatum])) Mod 5;0;5)+(Val(Month([Inschrijfdatum])>2))))))
Overigens vind ik je vraag steeds verwarrender worden; nu begin je ineens over MySQL! Waar komt dat ineens vandaan?
 
Het kostte mij wat moeite de vraag precies te definiëren. Maar je oplossing werkt perfect. Mijn dank.
Met MySQL bedoelde ik de code in de SQL-view. MySQL gebruikte ik om e.e.a. uit te proberen.
 
Graag gedaan :). Het was ook wel een interessante vraag. Access gebruikt een eigen variant van SQL, die ze dan geen eigen naam hebben gegeven, en die wel veel lijkt op de taal van MS SQL Server. MySQL is echt een andere taal, en je kunt een query dus nooit zomaar vanuit MySQL omzetten naar Access SQL. Wél kun je een Pass Through query maken, en dan kun je wél met MySQL werken. Maar dan moet je de code dus helemaal 'uit het hoofd' inkloppen, en werkt de QueryBuilder niet meer.
 
Even in VBA als denkwijze:
Door 2 maanden bij de inschrijfdatum (c00) op te tellen gebruik je 1 maart als start van het inschrijfjaar.
Code:
Sub M_snb()
    c00 = CDate("12-12-2010")
    y = DateDiff("yyyy", DateAdd("m", 2, c00), Date) Mod 5
    MsgBox IIf(y = 0, "lustrum", "nog " & 5 - y & " jaren te gaan")
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan