Totaal aantal dagen omrekenen in jaren en dagen

Status
Niet open voor verdere reacties.

Henk1908

Gebruiker
Lid geworden
6 apr 2022
Berichten
22
Goedemorgen,

Ik heb in een database de opstellingen van voetbalwedstrijden opgenomen. Nu wil ik de gemiddelde leeftijd per wedstrijd in jaren en dagen berekenen. Per speler heb ik al wel het totaal aantal dagen in een query berekend en wel met de volgende formule.

Som(DateDiff("d";[Geboortedatum];[Wedstrijddatum]))

Als voorbeeld is de uitkomst voor een wedstrijd op basis van bovenstaande query 8.391 dagen. Hoe reken ik met behulp van een query deze 8.391 dagen om in jaren en dagen? Hierbij wil ik de jaren en de dagen in een apart veld zichtbaar hebben. Alvast bedankt voor de te nemen moeite.


Met vriendelijke groet,
Henk
 
Laatst bewerkt:
Je weet toch hoeveel dagen er in een jaar zitten? 8391 delen door 365,25 zou genoeg moeten zijn.
 
Dat klopt, maar ik ben niet helemaal volledig geweest zie ik nu. De bedoeling is dat het aantal jaren en het aantal dagen in een apart veld zichtbaar worden gemaakt. Dit zou dan met de IIf-functiemoeten worden gerealiseerd. Ik heb de oorspronkelijke vraagstelling nu aangepast.
 
Laatst bewerkt:
Dat is het niet. Ik heb de leeftijd van de spelers per wedstrijd ook in de database staan en die is ook gesplitst in jaren en dagen. Dit is berekend met behulp van de IIf-functie, maar als het op een andere manier kan worden gerealiseerd is dat natuurlijk ook prima.
 
Waarom sla je de leeftijd op? Die kun je toch altijd berekenen als je hem nodig hebt? Dynamische gegevens sla je niet op in tabellen. Maar post eens een voorbeeldje, want ik sta niet te popelen om het na te bouwen.
 
Als we voor het gemak uitgaan van 365 dagen in het jaar, dan
  • Aantal jaren: FIX(Som(DateDiff("d";[Geboortedatum];[Wedstrijddatum]))/365)
  • Aantal dagen: Som(DateDiff("d";[Geboortedatum];[Wedstrijddatum])) MOD 365
 
Als antwoord op AccessGuru
user-online.png


Ik heb de benodigde data even in een nieuwe database gezet en daarin de QRY's in aangepaste vorm opgenomen. In QRY 1 wordt de gemiddelde leeftijd per speler per wedstrijd berekend. Ook is per speler het totaal aantal dagen berekend tussen zijn geboortedatum en de wedstrijddatum. In QRY 2 is een gemiddelde van het aantal dagen opgenomen op basis van de uitkomsten van QRY 1. Het aantal dagen van 8.391 dient nu te worden gesplitst in jaren en dagen.
 

Bijlagen

  • Leeftijd.zip
    67,4 KB · Weergaven: 8
Laatst bewerkt:
Query op basis van voorbeeld database:
Code:
SELECT Fix(Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*)/365) AS Jaren, Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*) Mod 365 AS Dagen
FROM [QRY 0 Boek - Opstellingen - Leeftijd];
 
De berekeningen kunnen wat nauwkeuriger dan in het voorbeeld van xps. Daar worden ze niet altijd korter van, maar het gaat uiteindelijk om de kwaliteit :).
Dit:
PHP:
Jaren: IIf([Wedstrijddatum]-DateSerial(Year([Wedstrijddatum]),Month([Geboortedatum]),Day([Geboortedatum]))<0,-1,0)+Year([Wedstrijddatum])-Year([Geboortedatum])
Zou ik zo doen:
PHP:
L_Jaar: DateDiff("yyyy",[Geboortedatum],[Wedstrijddatum],2,2)+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd"))

En dit:
PHP:
Dagen: [Wedstrijddatum]-DateSerial(IIf([Wedstrijddatum]-DateSerial(Year([Wedstrijddatum]),Month([Geboortedatum]),Day([Geboortedatum]))<0,-1,0)+Year([Wedstrijddatum]),Month([Geboortedatum]),Day([Geboortedatum]))
Vervang ik liever door dit:
PHP:
L_Dagen: DateDiff("d",DateSerial(Year([Wedstrijddatum])+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd")),Month([Geboortedatum]),Day([Geboortedatum])),[Wedstrijddatum])

En je Totalen berekening kan sowieso een stuk simpeler. Ik snapte al niet waarom je de Totalen knop had gebruikt :).
Dus dit:
PHP:
Dagentotaal: Som(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))
wordt dan dit:
PHP:
DagenTotaal: DateDiff("d",[Geboortedatum],[Wedstrijddatum],2,2)

Het aantal dagen van 8.391 dient nu te worden gesplitst in jaren en dagen.
En dat is dus een kwestie van je query 2 uitbreiden met twee velden.
PHP:
SELECT Wedstrijddatum, Count(Spelersnummer) AS Aantal, Avg([Dagen Totaal]) AS Leeftijddagen,
Avg(L_Jaar) AS Gem_Leeftijd, Avg(L_Dagen) AS Gem_Dagen, Int([leeftijddagen]/(365.25)) AS Expr1
FROM [QRY 1 Opstellingen - Leeftijd v2] GROUP BY Wedstrijddatum;
 
Hallo AccessGuru,

Ziet er gelikt uit hoor en inderdaad, hoe eenvoudiger hoe beter. Je geeft aan dat ik QRY 2 met twee velden moet uitbreiden. Ik ben hier even mee aan het stoeien geweest, maar kom er nog niet helemaal uit. Als ik het goed begrijp dat begint één veld met SELECT en het andere met FROM. Wat ik ook doe, ik krijg de melding: Deze expressie bevat een subquery waarvan de syntaxis ongeldig is. Hierbij merk ik wel op dat ik MS Acces 2019 (Nederlandstalig) gebruik en dat ik de komma's dus moet wijzigen in puntkomma's, maar dit biedt geen soelaas. Zou je per veld kunnen aangeven wat daarin moet worden opgenomen?

 
Ik heb de complete code uit mijn query geplakt. Dus inclusief de twee velden. Die plak je dus in het SQL venster.
 
Ik heb de code in het SQL-venster geplakt, maar er gaat iets fout. Ik heb een PRTSCR van het resultaat gemaakt en dat bijgevoegd. Ik kan er pas morgen weer verder naar kijken, maar tot nu toe onwijs bedankt :thumb:.
 

Bijlagen

  • Leeftijd.jpg
    Leeftijd.jpg
    18,2 KB · Weergaven: 13
Ik heb een eigen query gebruikt voor het laatste voorbeeld; bij jou heet die vermoedelijk dan toch anders. Dit is de SQL van die andere:

Code:
SELECT Spelersnummer, [Naam speler], Geboortedatum, Wedstrijddatum, 
DateDiff("yyyy",[Geboortedatum],[Wedstrijddatum],2,2)+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd")) AS L_Jaar, 
DateDiff("d",DateSerial(Year([Wedstrijddatum])+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd")),
Month([Geboortedatum]),Day([Geboortedatum])),[Wedstrijddatum]) AS L_Dagen, 
DateDiff("d",[Geboortedatum],[Wedstrijddatum],2,2) AS [Dagen Totaal]
FROM [QRY 0 Boek - Opstellingen - Leeftijd]
GROUP BY Spelersnummer, [Naam speler], Geboortedatum, Wedstrijddatum, 
DateDiff("yyyy",[Geboortedatum],[Wedstrijddatum],2,2)+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd")), 
DateDiff("d",DateSerial(Year([Wedstrijddatum])+(Format([Geboortedatum],"mmdd")>Format([Wedstrijddatum],"mmdd")),
Month([Geboortedatum]),Day([Geboortedatum])),[Wedstrijddatum]),DateDiff("d",[Geboortedatum],[Wedstrijddatum],2,2);
 
QRY 1 draait perfect nu! Blijft QRY 2 over. Peter (xps350)
heeft voor deze QRY aangegeven hoe de 8.391 dagen kunnen worden gesplitst in jaren en dagen. Dit werkt wel, maar de uitkomst is 22 jaren en 361 dagen. Ik weet op basis van een publicatie van de desbetreffende wedstrijd en een berekening in Excel dat de uitkomst 22 jaren en 355 dagen moet zijn. Waardoor kan het verschil zijn veroorzaakt?
 
Dat komt doordat ik rekende met 365 dagen in een jaar. AccessGuru wees al op die onnauwkeurigheid
Dus: 8391 - (22 * 365) = 361

8391 - (22 * 365,25) komt met 355,5 al beter in de buurt.
 
Helder! Is dit ook als zodanig in onderstaande code op te nemen? Als dat zou kunnen, dan heb ik precies wat ik hebben wil. Ik heb wat pogingen gedaan, maar krijg dan foutmeldingen over de argumentatie.

SELECT Fix(Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*)/365) AS Jaren, Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*) Mod 365 AS Dagen
FROM [QRY 0 Boek - Opstellingen - Leeftijd];
 
Ik heb de berekening van de dagen nu anders gedaan (in feite vergelijkbaar met 8391 - (22 * 365,25)). Zoals gezegd komt dat uit op 355,5. Het resultaat kap ik af.

Code:
SELECT Fix(Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*)/365.25) AS Jaren, Fix(Sum(DateDiff("d",[Geboortedatum],[Wedstrijddatum]))/Count(*)-([Jaren]*365.25)) AS DagenFROM [QRY 0 Boek - Opstellingen - Leeftijd];
 
Ik heb deze code nu ingevoerd, maar krijg de foutmelding dat de instructie SELECT een gereserveerd woord bevat of een argumentnaam die verkeerd is gespeld, ontbreekt of en verkeerd leesteken heeft.
 
Misschien iets misgegaan bij kopiëren.
Er lijkt zo te zien in ieder geval een spatie te ontbreken tussen Dagen en FROM.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan