[MySQL] Leeftijd berekenen

Pagina: 1
Acties:
  • 1.650 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 11-02 18:34

Zenda

goes milk!

Topicstarter
Dag allemaal, ik probeer dus de leeftijd van iemand te berekenen aan de hand van de geboortedatum in MySQL.

code:
1
2
3
SELECT  CONCAT( geboortejaar, geboortemaand, geboortedag ) AS gebdatum, 
FROM gebruikers 
WHERE id = 4;


Wat ik nu terug krijg is het veldje gebdatum met inhoud: yyyymmdd (jaar maand dag).

Wat ik wil, is de leeftijd berekenen, dus hoe oud iemand is.

Wat ik hiervoor moet weten is de huidige datum (zelfde volgorde: yyyymmdd zodat ik kan de huidige datum van de db datum kan aftrekken) en hierdoor de uitkomst krijg.

Wat ik alleen niet weet, is hoe ik de datum in MySQL krijg op die manier (yyyymmdd).. Iemand een idee?! :)

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

waarom niet gewoon een date veld ipv 3 velden?

Multimonitor is relax :P


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Waarom sla je het jaar, de maand en de dag apart op? Je kan toch gewoon een DATE veld gebruiken voor de datum?

Acties:
  • 0 Henk 'm!

Anoniem: 55396

je beseft dat je niet gewoon
20041123 - 20031224 kan doen he? dan kom je uit op 9899, en moet je daarmee helemaal moeilijk gaan doen.

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Als (in php) $d de huidige dag is, in de vorm 2004-11-23 en je de geboortedatum (dob) als DATE in je database opslaat (dus yyyy-mm-dd, bijv. 1981-04-05) dan levert:

code:
1
SELECT YEAR( '$d' ) - YEAR( dob ) - ( RIGHT( '$d', 5 ) < RIGHT( dob, 5 ) ) AS age


de leeftijd op :)

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 11-02 18:34

Zenda

goes milk!

Topicstarter
das waar.. maar ik vroeg niet hoe ik de geboortedatum het beste kan opslaan, maar volgens mij vroeg ik hoe je de leeftijd berekend aan de hand van deze informatie. ;)

Het klopt idd dat je niet 20041123 - 20031224 kunt doen. Heb ik niet zo goed over nagedacht idd. Wat ik wel zou kunnen doen is 2004 - 2003 bijvoorbeeld, en daarna kijken of 11 kleiner is dan 12, zo niet dan is de leeftijd 0, en zo ja dan is de leeftijd 1.

Hoe zou ik het dan het beste kunnen aanpakken om de huidige leeftijd te krijgen? Ik kan de tabel structuur niet meer wijzigen omdat ik dan te veel moet aanpassen. Dus graag alleen antwoorden van mensen die echt een idee hebben hoe ik het zou kunnen aanpakken met de huidige structuur. Alvast bedankt :)

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Je kunt de functies YEAR en DAYOFYEAR gebruiken op een DATE veld. Dan ziet t er ongeveer zo uit:

code:
1
2
3
4
SELECT ( CASE 
    WHEN DAYOFYEAR(datum)<DAYOFYEAR(NOW()) 
    THEN YEAR(NOW()) - YEAR(datum) - 1
    ELSE YEAR(NOW()) - YEAR(datum) ) AS leeftijd

Waarbij je voor datum een of ander DATE veld moet plaatsen. Die kun je eventueel samenstellen uit je drie losse velden. Zie ook:
http://dev.mysql.com/doc/...e_and_time_functions.html

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Zenda schreef op dinsdag 23 november 2004 @ 12:10:
das waar.. maar ik vroeg niet hoe ik de geboortedatum het beste kan opslaan, maar volgens mij vroeg ik hoe je de leeftijd berekend aan de hand van deze informatie. ;)
Je moeilijkheden met het opvragen van de informatie die je wilt is inherent aan de uitermate brakke manier van opslag. Als je zinnige queries wilt maken, moet je ook je data zinnig opslaan.

(In het algemeen vloeit ongeveer 85% van alle moeilijkheden met queries voort uit een slecht datamodel.)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08-05 21:06
Anoniem: 55396 schreef op dinsdag 23 november 2004 @ 12:03:
je beseft dat je niet gewoon
20041123 - 20031224 kan doen he? dan kom je uit op 9899, en moet je daarmee helemaal moeilijk gaan doen.
Waarom kan dat niet? Dat is toch precies wat je wil hebben? Om het aantal jaren te vinden moet je nog even delen door 10000 en dan afronden en dan kom je op iets minder dan 1 jaar uit. Volgens mij werkt die methode prima.
Zenda schreef op dinsdag 23 november 2004 @ 11:57:
Wat ik alleen niet weet, is hoe ik de datum in MySQL krijg op die manier (yyyymmdd).. Iemand een idee?! :)
Sla data liever gewoon op als data, dan kun je er tenminste handig mee rekenen. Haploid's suggestie is prima geschikt.

Acties:
  • 0 Henk 'm!

Anoniem: 8500

Haploid schreef op dinsdag 23 november 2004 @ 12:11:
Je kunt de functies YEAR en DAYOFYEAR gebruiken op een DATE veld.
Met DAYOFYEAR loop je tegen de lamp met schrikkeldagen:
1 maart 2004 is nl de 61e dag, 1 maart 2003 is de 60e dag

met TO_DAYS hou je daar wel rekening mee:
code:
1
SELECT  DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( geboortedatum ) ) , '%Y' ) + 0 AS leeftijd


je moet 'geboortedatum' dan nog vervangen door jouw samengestelde geboortedatum

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Mijn oplossing gaat ook goed met schrikkeljaren.

Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 11-02 18:34

Zenda

goes milk!

Topicstarter
tnx voor de reacties mensen :D

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

En, ga je je databasedesign wijzigen? ;)

Acties:
  • 0 Henk 'm!

Anoniem: 92987

Hoe zou ik het dan het beste kunnen aanpakken om de huidige leeftijd te krijgen? Ik kan de tabel structuur niet meer wijzigen omdat ik dan te veel moet aanpassen.
Het antwoord is al wel gegeven, maar toch wat info voor de toekomst.. Ik zou dan toch time(); gebruiken, wat het aantal seconden sinds de unix epoch in 1970 teruggeeft, nummertjes die je dus wel heel simpel van elkaar kan aftrekken, waarna je met date("Ymd",nummertje); bijvoorbeeld YYYYMMDD krijgt. Ook is een query met alleen die int natuurlijk heel snel..

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08-05 21:06
Anoniem: 8500 schreef op dinsdag 23 november 2004 @ 12:29:
Met DAYOFYEAR loop je tegen de lamp met schrikkeldagen:
1 maart 2004 is nl de 61e dag, 1 maart 2003 is de 60e dag
Daar heb je gelijk in.
met TO_DAYS hou je daar wel rekening mee:
code:
1
SELECT  DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS( geboortedatum ) ) , '%Y' ) + 0 AS leeftijd
Nee, dat werkt helaas om dezelfde reden niet. DATE_FORMAT(FROM_DAYS(365)) geeft namelijk altijd dezelfde uitvoer (0, concreet, omdat het jaar 0 blijkbaar een schikkeljaar is) ongeacht of er een schikkeldag tussen de twee vergeleken data zat. Dat klopt dus niet.

Al met al is de oplossing met een data in de vorm van YYYYMMDD van elkaar aftrekken dus nog de meeste makkelijke, naar mijn mening, en een van de weinige correcte oplossingen.

[ Voor 13% gewijzigd door Soultaker op 23-11-2004 14:40 ]


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Anoniem: 92987 schreef op dinsdag 23 november 2004 @ 13:54:
[...]


Het antwoord is al wel gegeven, maar toch wat info voor de toekomst.. Ik zou dan toch time(); gebruiken, wat het aantal seconden sinds de unix epoch in 1970 teruggeeft, nummertjes die je dus wel heel simpel van elkaar kan aftrekken, waarna je met date("Ymd",nummertje); bijvoorbeeld YYYYMMDD krijgt. Ook is een query met alleen die int natuurlijk heel snel..
Gaat niet goed als je personen in je db hebt die van vóór 1970 zijn, toch? Wat is er nou mis met de manier die ik beschreven heb? 1 simpele query die altijd het juiste resultaat geeft, ongeacht schrikkeljaren of geboortedata < 1970.

Acties:
  • 0 Henk 'm!

  • Harrie21
  • Registratie: September 2004
  • Laatst online: 19-12-2024

Harrie21

Damn..

Ik heb toevallig net een soort gelijk probleem, alleen snap de oplossingen hierboven niet echt.

Ik moet namelijk in een database de looptijd van de dossiers berekenen. Hiervoor heb ik een begindatum: dbegin en een einddatum: dsluiting Deze zijn gegeven in de middelange datum notatie, dus dd-mm-yy.

Nu moet ik dus de looptijd tussen deze 2 datums berekenen, maar weet niet best welke code ik daarvoor moet gebruiken. Is er iemand die me hiermee kan helpen?

Bij voorbaat dank!

Sup


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Soultaker schreef op dinsdag 23 november 2004 @ 12:27:
Waarom kan dat niet? Dat is toch precies wat je wil hebben? Om het aantal jaren te vinden moet je nog even delen door 10000 en dan afronden en dan kom je op iets minder dan 1 jaar uit. Volgens mij werkt die methode prima.
Afronden of afkappen?

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Anoniem: 92987 schreef op dinsdag 23 november 2004 @ 13:54:
Het antwoord is al wel gegeven, maar toch wat info voor de toekomst.. Ik zou dan toch time(); gebruiken, wat het aantal seconden sinds de unix epoch in 1970 teruggeeft, nummertjes die je dus wel heel simpel van elkaar kan aftrekken, waarna je met date("Ymd",nummertje); bijvoorbeeld YYYYMMDD krijgt. Ook is een query met alleen die int natuurlijk heel snel..
En dan delen door 365,25 * 24 * 60 * 60 ofzo?

[ Voor 3% gewijzigd door Olaf van der Spek op 23-11-2004 15:53 ]


Acties:
  • 0 Henk 'm!

Anoniem: 113889

Reinier schreef op dinsdag 23 november 2004 @ 11:58:
Waarom sla je het jaar, de maand en de dag apart op? Je kan toch gewoon een DATE veld gebruiken voor de datum?
DATE velden zijn OK als alle gegevens bekend zijn. Als bv alleen iemands geboortejaar bekend is, of iemands geboortemaand is in de bron onleesbaar, kan het handig zijn dag, maand en jaar apart op te slaan. Wanneer dan toch een een DATE-veld gebruikt gaat worden is het nodig de precisie op te slaan in een extra veld.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Anoniem: 113889 schreef op dinsdag 23 november 2004 @ 16:12:
[...]


DATE velden zijn OK als alle gegevens bekend zijn. Als bv alleen iemands geboortejaar bekend is, of iemands geboortemaand is in de bron onleesbaar, kan het handig zijn dag, maand en jaar apart op te slaan. Wanneer dan toch een een DATE-veld gebruikt gaat worden is het nodig de precisie op te slaan in een extra veld.
Je kunt toch 00 gebruiken voor een onbekende maand of dag?

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als alleen iemand's geboortejaar bekend is kun je ook niet met zekerheid de juistes leeftijd vaststellen, dus dat vind ik een beetje een non-argument..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Anoniem: 92987

Reinier schreef op dinsdag 23 november 2004 @ 14:46:
[...]


Gaat niet goed als je personen in je db hebt die van vóór 1970 zijn, toch? Wat is er nou mis met de manier die ik beschreven heb? 1 simpele query die altijd het juiste resultaat geeft, ongeacht schrikkeljaren of geboortedata < 1970.
Die geboortedata van voor 1970 zijn idd een probleem, kan ik zo snel niks op bedenken. Ik zag in de changelog van React dat er stond dat de bug van geboortedata van voor 1970 was opgelost, die hebben er dus wat op gevonden en gebruiken waarschijnlijk ook time(). Misschien daar eens vragen..
OlafvdSpek schreef op dinsdag 23 november 2004 @ 15:53:
[...]

En dan delen door 365,25 * 24 * 60 * 60 ofzo?
Nee, zoals ik al zei, dmv date("Ymd",nummertje); of in welk formaat je het ook wil.. Zie de PHP Manual voor date().

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 29-04 23:48

dusty

Y! Celebrate Life!

Waarom heeft hier nog niemand het woordje "DateDiff" laten vallen?

Je wilt het verschil tussen twee datums hebben, waarvoor dus de functie datediff in MYSQL bestaat.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-04 16:18
OlafvdSpek schreef op dinsdag 23 november 2004 @ 15:53:
[...]

En dan delen door 365,25 * 24 * 60 * 60 ofzo?
365.25 is trouwens ook niet heel exact he... Om de 100 jaar is het geen schrikkeljaar, en om de 1000 weer wel :P

[ Voor 45% gewijzigd door riezebosch op 23-11-2004 20:12 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 08-05 17:44

MBV

nooit gezocht in de php-site?

reactie op www.php.net/date:
[quote]
chris dot shepherd at gmail dot com
27-Aug-2004 11:59
A nice way to calc age seeing that mktime only goes back until 1970 is to use the date function like this...
[/qoute]
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//Find the difference in year, month, and day
$yeardiff = date("Y") - $dobyear;
$monthdiff = date("m") - $dobmonth;
$daydiff = date("j") - $dobday;

/*
 * if month or day is negative we have yet to reach it so
 * we need to subtract a year seeing we haven't
 * reached our birthday yet, else yeardiff is correct
 */

if ($monthdiff <= 0 && $daydiff < 0) {
   $age = $yeardiff - 1;
} else {
   $age = $yeardiff;
}

echo $age;

[ Voor 8% gewijzigd door MBV op 23-11-2004 20:26 ]


Acties:
  • 0 Henk 'm!

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

dusty schreef op dinsdag 23 november 2004 @ 20:08:
Waarom heeft hier nog niemand het woordje "DateDiff" laten vallen?

Je wilt het verschil tussen twee datums hebben, waarvoor dus de functie datediff in MYSQL bestaat.
Is wel zo, maar DATEDIFF telt het verschil in dagen. Dus dan krijg je als antwoord bijv.
6666. Moet je toch gaan delen door 365.24... om de leeftijd te krijgen. Maar dat kan altijd net een dagje ernaast zitten omdat de schrikkeldagen niet gelijkmatig over het jaar verdeeld zitten (is een beetje moeilijk met 1 schrikkeldag).

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Acties:
  • 0 Henk 'm!

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Ok, dit zou (denk ik) alle mogelijke gevallen correct moeten dekken:
code:
1
2
3
4
5
select 
    case when month(now())<month(geboren) or (month(now())=month(geboren) and day(now())<day(geboren))
    then year(now())-year(geboren)
    else year(now())-year(geboren)+1
    as leeftijd

Of voor dit specifieke voorbeeld, met de drie gescheiden (tekst-)velden:
code:
1
2
3
4
5
select 
    case when month(now())<cast(geboortemaand as int) or (month(now())=cast(geboortemaand as int) and day(now())<cast(geboortedag as int))
    then year(now())-cast(geboortejaar as int)
    else year(now())-cast(geboortejaar as int)+1
    as leeftijd


Toch? }:O

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Anoniem: 92987 schreef op dinsdag 23 november 2004 @ 19:59:
Nee, zoals ik al zei, dmv date("Ymd",nummertje); of in welk formaat je het ook wil.. Zie de PHP Manual voor date().
Dus iets als date("Ymd", time() - time_geboorte)?

[ Voor 5% gewijzigd door Olaf van der Spek op 23-11-2004 22:09 ]


Acties:
  • 0 Henk 'm!

Anoniem: 113889

OlafvdSpek schreef op dinsdag 23 november 2004 @ 16:43:
[...]

Je kunt toch 00 gebruiken voor een onbekende maand of dag?
00 kan inderdaad gebruikt worden bij gescheiden velden. Maar niet elk DBMS wordt happy van een datumveld met dag of maand 00.

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08-05 16:13
DATEDIFF is sowieso pas beschikbaar sinds MySQL 4.1.1... Niet iedereen is zo up to DATE ;)

Acties:
  • 0 Henk 'm!

Anoniem: 92987

-- had niet gezien dat er 2 pagina's al waren dus was op oude dingen aan het reageren :X

[ Voor 78% gewijzigd door Anoniem: 92987 op 26-11-2004 10:45 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08-05 21:06
Morrar schreef op woensdag 24 november 2004 @ 00:20:
DATEDIFF is sowieso pas beschikbaar sinds MySQL 4.1.1... Niet iedereen is zo up to DATE ;)
Ik mag hopen van wel, want in allerlei oude versies van 4.1 zitten hele vervelende bugs (onder andere om remote te connecten en authenticatie te omzeilen). Als je nog met een oude versie werkt is het dus wel verstandig om eens te upgrade naar MySQL 4.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Soultaker schreef op vrijdag 26 november 2004 @ 13:39:
Ik mag hopen van wel, want in allerlei oude versies van 4.1 zitten hele vervelende bugs (onder andere om remote te connecten en authenticatie te omzeilen). Als je nog met een oude versie werkt is het dus wel verstandig om eens te upgrade naar MySQL 4.
3.23 en 4.0 bestaan ook nog hoor.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08-05 21:06
Oh, ik wist niet dat die nog supported waren...

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
3.23 is pas sinds kort niet meer 'generally available' en 4.1 pas sinds kort.
Zeker voor 4.0 zal nog wel een tijd support zijn.

Acties:
  • 0 Henk 'm!

Anoniem: 116066

lees http://dev.mysql.com/doc/...e_and_time_functions.html er eens op na (en zoals eerder gemeld kun je de boel beter opslaan in 1 DATE-veld)
Pagina: 1