03. november 2010 - 16:34Der er
14 kommentarer og 1 løsning
Udregning af alder.
Hej. Jeg har følgende script til udregning af alder.
$wins = mysql_query("SELECT (YEAR(CURDATE())-YEAR(date))-(RIGHT(CURDATE(), 5)<RIGHT(date, 5)) as alder,
MIN(wd.year) AS year, wd.navn AS navn, wd.nummer AS nummer, wd.hold AS hold, te.id AS teamid, te.name AS teamname, t.id AS rytterid, t.flags AS flags, t.logo AS logo, t.name AS name
FROM alleaar AS wd INNER JOIN turen AS t INNER JOIN teams AS te ON wd.hold = te.id
WHERE wd.navn = t.id AND wd.hold = te.id
GROUP BY t.name HAVING year = $aar
Det virker også fint. Jeg kunne bare tænke mig, at alderen blev regnet ud til det pågældende år, og ikke til idag.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Den første YEAR() skal være feltnavnet for aarstal. Og den første RIGHT() skal være dato for turstart. Og her skal så ændres på 5 tallet, måske. Hvordan er startdato gemt ?
Feltnavnet for årstal er YEAR i tabellen alleaar. Mht. startdato. Mener du det første år de deltog i turen? Det er gemt som YEAR i tabellen alleaar. Som jeg læser: ("SELECT (YEAR(CURDATE())-YEAR(date))-(RIGHT(CURDATE(), 5)<RIGHT(date, 5)) skal det første YEAR være årstallet for første start i turen, og det andet YEAR, årstallet fra rytterens fødselsdag med feltnavn date i tabellen turen.
hvor turaar er feltet med aarstal, og turdato er både år og dato for tur start. Hvis det kun er datoen, vil jeg mene den første RIGHT() blot skal skiftes ud med datoen. ( standard sql dato! )
Jeg bryder mig iøvrigt ikke om at du bruger feltnavne som også er en funktion i mysql, year, date m.m.
Tak for det. Det er utroligt så lidt der skal til. Det er jo meget let, når man kan det. Lige et tillægsspørgsmål. Jeg har ryttere uden fødselsdata. Hvordan udelader jeg over dem? Jeg stoler på dig mht. tear, date mm, så det går jeg i gang med at ændre.
Der var jeg lige hurtig nok. Tjekkede et par stykker som passede, men fandt senere en del der ikke passede. Vil det være nemmere hvis jeg indsætter et datefelt i tabellen alleaar, så det er to datoer der skal trækkes fra hindanden?
ehh, datoformat vil jeg lave til f.eks. 2010-11-04 (start) og 2010-11-08 (slut) turstart og turslut I rytter tabel skal det være samme format for fødselsdato.
Det er lavet i det format. Så er det jeg gerne vil trække dato i "turen" fra start i "alleaar1". Jeg har prøvet med:
$wins = mysql_query("SELECT
MIN(wd.alleaar) AS alleaar, wd.navn AS navn, wd.nummer AS nummer, wd.start AS start, wd.hold AS hold, te.id AS teamid, te.name AS teamname, t.id AS rytterid, t.flags AS flags, t.logo AS logo, t.name AS name, t.dato AS dato,
DATEDIFF(wd.start, t.dato) as alder
FROM alleaar1 AS wd INNER JOIN turen1 AS t INNER JOIN teams AS te ON wd.hold = te.id
WHERE wd.navn = t.id AND wd.hold = te.id
GROUP BY t.name HAVING alleaar = $aar
Så får jeg et tal ud, som jeg formoder er antal dage. Jeg har så prøvet, på lommeregner, at dividere med 365, men det passer stadig ikke med alderen det år de først deltog.
Det er træls, men lige et sidste forsøg inden jeg giver op. Jeg har fundet frem til den rigtige alder på denne måde:
$wins = mysql_query("SELECT
MIN(wd.alleaar) as firstyear, wd.navn AS navn, wd.nummer AS nummer, wd.start AS start, wd.hold AS hold, te.id AS teamid, te.name AS teamname, t.id AS rytterid, t.flags AS flags, t.logo AS logo, t.name AS name, t.dato AS dato,
DATEDIFF(wd.start, t.dato) as alder
FROM alleaar1 AS wd INNER JOIN turen1 AS t INNER JOIN teams AS te ON wd.hold = te.id
WHERE alleaar=$aar AND wd.navn = t.id AND wd.hold = te.id
Der er bare det ved det, at alle ryttere fra det pågældende år bliver trukket ud. Men jeg kan ikke finde ud af at sortere nye ryttere fra. Gider du komme med et forslag og et svar. Lykkes det vil det være skønt, ellers gider jeg ikke bøvle med det mere.
CREATE TABLE rytter ( id int(10) unsigned NOT NULL AUTO_INCREMENT, navn varchar(24) COLLATE latin1_bin NOT NULL, f_dato date NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin AUTO_INCREMENT=5 ;
$sql = "SELECT t1.navn, t2.navn as team, t3.navn as tour, MIN(YEAR(t4.startdato)) as aar, (YEAR(t4.startdato)-YEAR(t1.f_dato))-(RIGHT(t4.startdato, 5)<RIGHT(t1.f_dato, 5)) as alder FROM rytter as t1 INNER JOIN hold as t2 INNER JOIN tournames as t3 INNER JOIN tours as t4 ON t1.id = t4.rytterid AND t2.id = t4.holdid AND t3.id = t4.tourid GROUP BY t1.navn HAVING aar = 2010 ORDER BY t1.navn";
M.h.t. til alder hvis fødsel ikke er angivet, kan du i while tjekke om alder er tom.
Du kan også:
$sql = "SELECT t1.navn, t2.navn as team, t3.navn as tour, MIN(YEAR(t4.startdato)) as aar, IF(t1.f_dato IS NULL, 'n/a', (YEAR(t4.startdato)-YEAR(t1.f_dato))-(RIGHT(t4.startdato, 5)<RIGHT(t1.f_dato, 5))) as alder FROM rytter as t1 INNER JOIN hold as t2 INNER JOIN tournames as t3 INNER JOIN tours as t4 ON t1.id = t4.rytterid AND t2.id = t4.holdid AND t3.id = t4.tourid GROUP BY t1.navn HAVING aar = 2010 ORDER BY t1.navn";
Tusind tak for det. Jeg vil arbejde med alle dine forslag, og håbe på godt resultat. Lykkes det er det godt ellers dropper jeg det. Gider du sende et svar så jeg kan gi points?
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.