Avatar billede billyboy92 Nybegynder
08. maj 2013 - 17:37 Der er 14 kommentarer

Hvordan finder jeg gennemsnitalderen

Hej :)

Jeg arbejder med min hjemmeside om min slægt (www.slaegtenfraharte.dk) hvor jeg har en stor database med 1145 indtastede personer, jeg forsøger at finde gennemsnitsalderen på dem, men er løbet panden mod muren og håber derfor nogen herinde har en ide eller kan hjælpe mig videre. Jeg skal helst præcis bruge et script som kan udregne gennemsnitsalderen på alle personerne hvor der er anført et fødsels og døds årstal i databasen.

Min database er opbygget sådan her (se nedenunder) der er nogen kommentar med eksempler til det jeg tilføjer som standart

`person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `navn` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `f_dato` varchar(100) COLLATE latin1_general_ci NOT NULL, (dato på dansk, eksempelvis '1. maj' eller '23. marts')
  `f_aar` varchar(5) COLLATE latin1_general_ci NOT NULL,(eks. '1991' eller '?')
  `f_sted` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `d_dato` varchar(100) COLLATE latin1_general_ci NOT NULL, (dato på dansk, eksempelvis '1. maj' eller '23. marts')
  `d_aar` varchar(5) COLLATE latin1_general_ci NOT NULL,(eks. '1991' eller '?')
  `d_sted` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `d_aarsag` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `d_begravet` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `kon` int(1) NOT NULL,
  `arbejde` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `far_id` int(11) NOT NULL,
  `mor_id` int(11) NOT NULL,
  `notater` longtext COLLATE latin1_general_ci NOT NULL,
  `rettet` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `nulevende` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ;

Med venlig hilsen
Billy
08. maj 2013 - 17:59 #1
Hej,

Som jeg ser det:

1: du har brug for et (eller flere) SCRIPT(s) som:

a: udtrækker og finder fødselsdata (som dag, måned år):
b: udtrækker og finder dødsdato (som dag, måned år):

2: finder alder i dage (måneder, ÅR ) ?

for alle dine 1145 personer.

Det næste interessante spørgsmål er så om du vil have et aritmetisk gennemsnit (dvs: sum af alle år divideret med 1145) eller om du vil have et mere statistisk gennemsnit (dvs. et geometrisk gennemsnit).

PS: Hvis gemetrisk gennemsnit ikke siger dig noget som helst er det OK, så ønsker du det aritmetiske.

Kristian

PS: Sådan lidt uden for nummer:

Kender du DDA og deres KIP DATA ? (Folketællinger og Kirkebøger) ??
DDA = Dansk Data Arkiv, Odense
Avatar billede billyboy92 Nybegynder
08. maj 2013 - 18:22 #2
Jeg ønsker det aritmetiske gennemsnit(hvad jeg forstår er eks 75år) af alderen ved personerne hvor der er et fødsels og dødsår i databasen.

_ _

Ja det kender jeg godt til Kristian, hvad vil du gerne vide ?
08. maj 2013 - 18:59 #3
HEJ,

Lad  os tage et sidste først:

Jeg vil egentlig ikke vide noget om DDA (jeg ved det allerede. Jag var ansat der i 2 perioder fra 82 --> 88 og 00 - 04), men hvis du ikke vidste noget om slægtsforskningens dokumentation var der en mulighed der, jeg blot ville fortælle dig om.

Og for at komme tilbage til det andet (første):

Hvad havde du tænkt dig at bruge som overordnet sprog til din side: PHP (eksempelvis ) ?

KR
Avatar billede billyboy92 Nybegynder
08. maj 2013 - 19:29 #4
Oprettede tråden under kategorien php, så troede jeg at det var det jeg havde henvist til jeg bruger - men ja php :) lyder spændende med jobbet, hvor søger man hende for at få sådan en stilling?

Har selv arbejdet lidt med noget like dette hvor jeg henter alle personer ud som har et fødsels og dødsår, jeg henter dødsåret som jeg minusser fødselsåret, hvilket gir alder (ved godt der kan være noget med nogen måneder, men det ville jeg tilrette senere)


$sql_gem_alder = "SELECT *  FROM ".DB_PERSON." WHERE f_aar != '?' AND d_aar != '?' ";
$query_gem_alder = mysql_query($sql_gem_alder) or die(mysql_error());
//$alder = 0;
$antal = mysql_num_rows($query_gem_alder);
while($row = mysql_fetch_object($query_gem_alder)){
    $alder .= $row->d_aar - $row->f_aar.",";
}
$gennemsnit = (udregning af gennemsnitalderen?) her kan jeg ikke rigtigt komme videre
echo $gennemsnit;
08. maj 2013 - 19:57 #5
Hej,

JOB:

jeg arbejdede først som systemtekniker (ham med loddekolben) og JA, det gav mange sjove oplevelser !! Prøv at snakke lidt med dem på Rigsarkivet (ved Chr. Borg).

Projekt:

jeg kan se at du er ret meget inde i PHP, glæder mig, da slipper vi en masse indledning:

Som jeg læser det her er det EN METODE som kan konvertere FØDE-DATo (ddMMyyyy) til en INTEGER (FØDE-INTEGER) og det samme for DØDSDATO (DØDS-integer) (sikke et navn (hehe)). Trække de 2 tal fra hinanden og OMDANNE ALDER-INTEGER til formatet DD MM ÅÅÅÅ (måske ikke DD MM ?).

Jeg vil sætte FØDE-INTEGER til 0 og DØDS-INTEGER til XX (dage) så kan denne forskel beregnes ud fra de give datoer.

Men her må jeg konferere med min PHP-bibel (det er noegn dage siden jeg sidst så i den.. ) og den lokale harddisk (den ovenpå skuldrene) trænger et REFRESH!

KR
Avatar billede jakobdo Ekspert
08. maj 2013 - 20:25 #6
Jeg ville jo anbefale du fik "fødedato" og "dødsdato" oprettet som DATE field.
Når det er på plads, ville du kunne lave:

SELECT AVG(DATEDIFF(DØDSDATO,FØDEDATO)) AS gennemsnitsdage FROM...

Så vil du få gennemsnitsdage fra din tabel. (er dog utestet, men i mit hoved burde det virke) :o)
08. maj 2013 - 21:11 #7
billyboy92, jeg ved, at det ikke var det du spurgte om, men jeg kan ikke dy mig.  Du kender formodenligt mysql datatypen DATE, og det er sikkert med velberådt hu, at du har valgt ikke at bruge den datatype, men at gemme datoer som tekststrenge (som datatype VARCHAR) og bruger to felter, et for dato og et for år, for hvert af fødsels- og dødsdag.

Men hvis du havde valgt at bruge datatypen DATE (eller kunne overveje at ændre tabellen) kunne du løse opgaven meget enkelt.

Antag, at du havde sådan en tabel:

person
id ddag fdag
1 '2013-12-11' '1990-01-31'
2 '2012-07-08' '1991-02-03'
3 '0000-00-00' '1992-03-04'
4 '2011-11-10' '0000-00-00'
5 '0000-00-00' '0000-00-00'

altså fem personer, hvoraf to har både dødsdato og fødselsdato, mens resten mangler en eller begge af disse.

Denne query  "SELECT SUM(DATEDIFF(ddag, fdag)) FROM person"  vil give resultatet 16541. Det er antal dage mellem ddag og fdag for de personer der har både ddag og fdag.  Queryen tæller ikke noget for de personer der ikke har både ddag og fdag.

Denne query  "SELECT COUNT(*) FROM person WHERE ddag <> '0000-00-00' AND fdag <> '0000-00-00' " vil give resultatet 2.  Ved at dividere det første resultat, omregnet til år, med det andet resultat får du gennemsnitsår mellem ddag og fdag for de der har både ddag og fdag.
08. maj 2013 - 21:18 #8
Jeg var så længe om at udarbejde og teste mit indlæg, at jeg ikke så #6.  Vi er således enige om at anbefale at bruge datatype DATE.  Jeg tænkte ikke så langt som at bruge AVG, men nu da jeg havde en testdatabase prøvede jeg det af, og det synes at virke.  Med ovenstående data fik jeg resultatet 8270.5000
Avatar billede billyboy92 Nybegynder
12. maj 2013 - 01:33 #9
Hej igen :) lige været væk nogen dage, men igen her til aften kommet tilbage og været i gang med at teste det af

Jeg støder ind i problemer ved at bruge datatypen DATE i mine felter i db'en, på grund af opbygningen/kodningen af siden bruger jeg datatypen VARCHAR lige nu, det er fordi jeg skriver datoer i dansk format eksempelvis 12. maj eller 21. december. Hvad angår selve året på en fødsel eller død, så er dette altid skrevet udelukkende i tal, jeg har fravalgt DATA-dtypen fordi jeg ikke vidste hvordan jeg skulle håndter personer som er født før år 1000, eksempelvis er min omkring 32 tipoldefar Gorm den Gamle der levede i 900'tallet?

Kan jeg ikke i php lave et regne stykke der ved udtræk fra databasen for årende og derefter regner det ud? Eller skal jeg på en måde over i DATA datatyper ?
12. maj 2013 - 08:47 #10
Det var heller ikke det følgende du spurgte om, men du siger, at dine tekststrenge (VARCHAR) i f_aar og d_aar altid indeholder tal.  Hvis du så brugte datatypen INT for f_aar og d_aar, så kan du direkte i mysql få gennemsnitsalderen på de der har både f_aar og d_aar ved denne query:

SELECT AVG(d_aar - f_aar) FROM person. 

Jeg lavede en lille test tabel med fem navne hvor tre havde både f_aar og d_aar og to manglede en af disse.  Queryen tog summen af (d_aar - f_aar) for de tre og dividerede det med tre, altså ignorerede de personer der manglede enten f_aar eller d_aar.

Du kan hente denne gennemsnitsalder til php uden dikkedarer såsom:

$query = mysql_query('SELECT AVG(d_aar - f_aar) FROM person');
$gennemsnitsalder = mysql_result($query, 0);

Det synes jeg da er simplere.

Hvis du vil gå den vej, så kan du rette database tabellen til med et par queries.  (Jeg kender ikke lige løsningen udenad, men den kunne du nok få ved et spørgsmål a la 'her er min tabel med d_aar og f_aar i datatype VARCHAR men indeholdende udelukkende hele tal.  Hvordan får jeg det lavet om til INT?)
Avatar billede arne_v Ekspert
13. maj 2013 - 00:41 #11
Det er god skik og brug at gemme datoer i en DATE som er sprog/land neutralt og saa lade ens bruger graensflade konvertere fra og til en tekst som er i et sprog/land specifikt format.

DATE burde kunne daekke aar 0-32000.
13. maj 2013 - 10:34 #12
Ja, det jeg ville have nævnt men kom fra det igen var, at det er en god ide at konstruere sine databasetabeler, så de representerer strukturen i ens data, uanset hvad det er man står og vil trække ud af tabellerne.  Hvis tabellerne reflekterer dataernes struktur og natur, så vil man ikke alene kunne trække de resultater ud man tænker på nu, men også andre resultater man kommer i tanker om og får behov for senere.  (arne_v, har jeg forstået det korrekt?)  Ligeledes er det en god ide at bruge redskaberne til det de er egnede til.  MYSQL, og andre database management systemer, er egnede til at bevare og gengive data, men er mindre egnet til at formattere og præsentere dataerne.  Det er til gengæld hvad PHP er egnet til.  Så hvis dine dataer indeholder datoer, så er det en god ide, som arne_v også siger, at gemme disse som DATE datatyper.  Så kan du samtidig løst det at "der kan være noget med måneder..."    Det er så i PHP du skal præsentere datoerne i dansk format. 

MEN det bestemmer du naturligvis selv, og hvis du beslutter at holde dig til at gemme datoerne som tekststrenge, så ville det være meget nærliggende at gemme årstallene, der hedder det samme på alle sprog, som INT i stedet for som tekststrenge.
20. maj 2013 - 12:42 #13
billyboy92, kom du fra det igen?  Så du indlæggene #10, #11, og #12?  Har det været til nytte?  Kom ind og fortæl hvad din videre hensigt er med dette spørgsmål.
20. december 2013 - 09:17 #14
billyboy92, jeg prøver lige en gang mere.  Der har ikke været aktivitet på tråden i mere end et halvt år, så spørgsmålet kan ikke længere være aktuelt.  Kan jeg bede dig lukke det igen, i overenstemmelse med Ekspertens regler.  Eller komme ind og fortælle hvad din videre hensigt er.  Jeg opretter dette som svar, ifald du skulle mene a have haft hjælp af mine indlæg.  Hvis ikke, så opret eget svar (eller bed om svar fra andre) og accepter og luk.  Please.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester