Avatar billede sevinding Juniormester
03. november 2010 - 16:34 Der 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.

Se: http://www.tourfacts.dk/year/rookies1.php?aar=1995
Jeg har på fornemmelsen, at det er i den øverste række jeg skal ændre noget, men..........
Avatar billede showsource Seniormester
03. november 2010 - 18:22 #1
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 ?
Avatar billede sevinding Juniormester
04. november 2010 - 04:52 #2
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.
Avatar billede showsource Seniormester
04. november 2010 - 06:10 #3
("SELECT (turaar-YEAR(date))-(RIGHT(turdato, 5)<RIGHT(date, 5))

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.
Avatar billede sevinding Juniormester
04. november 2010 - 08:56 #4
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.
Avatar billede sevinding Juniormester
04. november 2010 - 09:44 #5
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?
Avatar billede showsource Seniormester
04. november 2010 - 17:07 #6
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.
Avatar billede sevinding Juniormester
05. november 2010 - 04:57 #7
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.
Avatar billede showsource Seniormester
06. november 2010 - 16:19 #8
Jeg ved sgutte:
("SELECT (turaar-YEAR(date))-(RIGHT(turdato, 5)<RIGHT(date, 5))

I den skal du jo bruge de alias på tabeller som du laver.

Hvordan virker en gang imellem ?
Avatar billede sevinding Juniormester
07. november 2010 - 05:40 #9
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


GROUP BY
t.name HAVING firstyear = $aar

ORDER BY wd.nummer ASC

");

while($w=mysql_fetch_array($wins)){

$teamname = $w['teamname'];
if( strlen($teamname) > 25 )
{
$teamname = substr($teamname,0,25).'..';
}

$antaldage = $w['alder'];
$beregn = floor($antaldage/365);
$antaldage = $beregn ." Years " . ($antaldage - ($beregn*365)) . " Days";

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.
Avatar billede showsource Seniormester
07. november 2010 - 12:47 #10
Ehh, i et andet spm. fik du de ryttere som deltog første gang.
Hvordan ser den query ud ?
Avatar billede showsource Seniormester
07. november 2010 - 14:07 #11
Nåh, havde selvf. slettet det jeg havde fra tidligere, men lavede nogle nye tabeller.
Jeg vælger så at bruge 4 tabeller:


CREATE TABLE hold (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  navn varchar(24) COLLATE latin1_danish_ci NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=5 ;

--
-- Data dump for tabellen 'hold'
--

INSERT INTO hold (id, navn) VALUES
(1, 'CSC'),
(2, 'Astana'),
(3, 'Team Test'),
(4, 'Team Exp');

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen 'rytter'
--

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 ;

--
-- Data dump for tabellen 'rytter'
--

INSERT INTO rytter (id, navn, f_dato) VALUES
(1, 'Showsource', '1963-12-27'),
(2, 'Sevinding', '1970-04-30'),
(3, 'Testrytter', '1972-06-06'),
(4, 'Riis', '1962-11-05');

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen 'tournames'
--

CREATE TABLE tournames (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  navn varchar(24) COLLATE latin1_danish_ci NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=5 ;

--
-- Data dump for tabellen 'tournames'
--

INSERT INTO tournames (id, navn) VALUES
(1, 'Tour de France'),
(2, 'Vuelta Espania'),
(3, 'Danmark Rundt'),
(4, 'Tour Down Under');

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen 'tours'
--

CREATE TABLE tours (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  tourid int(10) unsigned NOT NULL,
  holdid int(10) unsigned NOT NULL,
  rytterid int(10) unsigned NOT NULL,
  startdato date NOT NULL,
  PRIMARY KEY (id),
  KEY tourid (tourid,holdid,rytterid,startdato)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=7 ;

--
-- Data dump for tabellen 'tours'
--

INSERT INTO tours (id, tourid, holdid, rytterid, startdato) VALUES
(1, 1, 1, 1, '2010-06-15'),
(2, 1, 1, 2, '2010-06-15'),
(3, 2, 1, 1, '2010-08-15'),
(6, 3, 1, 1, '2010-10-10'),
(5, 3, 1, 2, '2010-10-10');


( bemærk INDEX ( key) i tabellen tours )

Og flg. virker vist fint nok:


$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";

$rows = mysql_query($sql) or die (mysql_error());

echo mysql_num_rows($rows);


while($v = mysql_fetch_object($rows)) {

echo"<p>";
echo $v->navn.", hold: ".$v->team.", tour: ".$v->tour." alder: ".$v->alder;
}
Avatar billede showsource Seniormester
07. november 2010 - 14:18 #12
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";
Avatar billede showsource Seniormester
07. november 2010 - 14:25 #13
ehe, min sidste kommentar, kræver jo så default NULL for feltet f_dato
Avatar billede sevinding Juniormester
09. november 2010 - 04:56 #14
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?
Avatar billede showsource Seniormester
09. november 2010 - 08:05 #15
Ok
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