/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Udregne alder...
Fra : Rander


Dato : 21-06-05 23:38

Jeg hiver et datofelt ud af en sql-database. Datoen er en fødselsdato, og
jeg skal så beregne personens alder.

Lige umiddelbart synes time jo at være indlysende til det, så jeg var nødt
til at bruge mktime for at få fødselsdatoen konverteret til et timestamp.
Jeg slog den op på php.net for at finde ud af syntaksen, og ser så
sætningen:

Windows: Negative timestamps are not supported under any known version of
Windows. Therefore the range of valid years includes only 1970 through
2038.

Riiight... Nu er problemet bare at de fleste er over 40 år, og når siden
det ligger på bliver sat i produktion kommer det til at ligge på en Windows
server. Jeg bilder mig selv ind, at når en fødselsdag ligger før 1970 vil
det resultere i et negativt timestamp - true or false?

Hvad gør jeg så? Jeg har forsøgt mig frem med noget i stil med $Alder =
date("Ymd") - $Birthdate, men den tager jo ikke helt højde for om personen
har haft fødselsdag i år eller ej...

--
Lars Rander ** Pil ikke ved min adresse ** :(){ :&:& };:
http://rander.dk (temporarily down!)

Kun de viseste vise og de tåbeligste tåber forandrer sig aldrig. (Konfucius)


 
 
Ruben Hesselbæk (22-06-2005)
Kommentar
Fra : Ruben Hesselbæk


Dato : 22-06-05 07:06

Rander wrote:
> Jeg hiver et datofelt ud af en sql-database. Datoen er en fødselsdato, og
> jeg skal så beregne personens alder.
>
> Lige umiddelbart synes time jo at være indlysende til det, så jeg var nødt
> til at bruge mktime for at få fødselsdatoen konverteret til et timestamp.
> Jeg slog den op på php.net for at finde ud af syntaksen, og ser så
> sætningen:
>
> Windows: Negative timestamps are not supported under any known version of
> Windows. Therefore the range of valid years includes only 1970 through
> 2038.
>
> Riiight... Nu er problemet bare at de fleste er over 40 år, og når siden
> det ligger på bliver sat i produktion kommer det til at ligge på en Windows
> server. Jeg bilder mig selv ind, at når en fødselsdag ligger før 1970 vil
> det resultere i et negativt timestamp - true or false?
>
> Hvad gør jeg så? Jeg har forsøgt mig frem med noget i stil med $Alder =
> date("Ymd") - $Birthdate, men den tager jo ikke helt højde for om personen
> har haft fødselsdag i år eller ej...
>

Hejsa.

Jeg plejer at bruge en lidt upræcis måde, men den virker.

SELECT (TO_DAYS( now( ) ) - TO_DAYS( birthday )) /365 AS years from
SOME_TABLE

Laves dagsdato og fødselsdatoen om til dage, og trække dem fra hinanden
og dividere med antallet af dage på et år (365).

Den tager ikke højde for skudår og alt muligt andet, men den virker
sådan rimeligt.

/Ruben

Tommy Ipsen (30-06-2005)
Kommentar
Fra : Tommy Ipsen


Dato : 30-06-05 10:49

Hej

> Jeg plejer at bruge en lidt upræcis måde, men den virker.
>
> SELECT (TO_DAYS( now( ) ) - TO_DAYS( birthday )) /365 AS years from
> SOME_TABLE
>
> Laves dagsdato og fødselsdatoen om til dage, og trække dem fra hinanden
> og dividere med antallet af dage på et år (365).
>
> Den tager ikke højde for skudår og alt muligt andet, men den virker
> sådan rimeligt.

Tjahh - det er en god approksimation, men skyder den ikke nogle dage ved
siden af - og flere og flere jo ældre personen er?

Mvh Tommy

Geert Lund (22-06-2005)
Kommentar
Fra : Geert Lund


Dato : 22-06-05 08:29

Rander wrote:

> Hvad gør jeg så? Jeg har forsøgt mig frem med noget i stil med $Alder =
> date("Ymd") - $Birthdate, men den tager jo ikke helt højde for om personen
> har haft fødselsdag i år eller ej...

Hvis du udtrækker fødselsdagen fra et databasesystem - vil jeg da
foreslå du lader datdabasen beregne alderen i stedet for?

--
Mvh. Geert Lund


Rander (22-06-2005)
Kommentar
Fra : Rander


Dato : 22-06-05 09:06

Wed, 22 Jun 2005 09:28:49 +0200 brugte Geert Lund 12 linier på at fortælle
dette til dk.edb.internet.webdesign.serverside.php:

>> Hvad gør jeg så? Jeg har forsøgt mig frem med noget i stil med $Alder =
>> date("Ymd") - $Birthdate, men den tager jo ikke helt højde for om personen
>> har haft fødselsdag i år eller ej...
>Hvis du udtrækker fødselsdagen fra et databasesystem - vil jeg da
>foreslå du lader datdabasen beregne alderen i stedet for?

Øhm... Og hvordan gør jeg så det?

--
Lars Rander ** Pil ikke ved min adresse ** :(){ :&:& };:
http://rander.dk (temporarily down!)

Mange mænd drikker kun for at glemme deres kone.
Og så kommer de hjem og ser hende dobbelt. (Arthur Schopenhauer)


Geert Lund (22-06-2005)
Kommentar
Fra : Geert Lund


Dato : 22-06-05 09:19

Rander wrote:

> Øhm... Og hvordan gør jeg så det?

Hvilken database kører du med?



Geert Lund (22-06-2005)
Kommentar
Fra : Geert Lund


Dato : 22-06-05 09:45

Rander wrote:

> Øhm... Og hvordan gør jeg så det?

I MySQL kunne det se således ud:

CREATE TABLE `t_Test` (
`ID` int(11) NOT NULL auto_increment,
`Dato` date NOT NULL default '0000-00-00',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `t_Test` VALUES (1, '1925-05-20');
INSERT INTO `t_Test` VALUES (2, '1950-12-31');
INSERT INTO `t_Test` VALUES (3, '1976-08-31');


SELECT IFNULL( CAST( ( TO_DAYS( NOW() ) - TO_DAYS( Dato ) ) / 365.25 AS
SIGNED) ,0) AS Alder from t_Test


Hvilket gerne skulle returnere følgende rækker:

80
54
28

Der skulle også være taget højde for skudår :)



--
Med venlig hilsen
Geert Lund


Thomas Finnerup (22-06-2005)
Kommentar
Fra : Thomas Finnerup


Dato : 22-06-05 19:14

On Wed, 22 Jun 2005 10:44:30 +0200, Geert Lund
<glund-news@post.tele.dk> wrote:

> SELECT IFNULL( CAST( ( TO_DAYS( NOW() ) - TO_DAYS( Dato ) ) / 365.25 AS
> SIGNED) ,0) AS Alder from t_Test

Division bør efter min mening ikke være en del af aldersberegning. Jeg
vil i stedet foreslå dette:

SELECT
SUBSTRING(CURRENT_DATE(), 1, 4) -
SUBSTRING(Tabel.Foedselsdato, 1, 4) -
(
SUBSTRING(CURRENT_DATE(), 6, 5) <
SUBSTRING(Tabel.Foedselsdato, 6, 5)
)
AS Alder
...


Venligst
Thomas

Geert Lund (22-06-2005)
Kommentar
Fra : Geert Lund


Dato : 22-06-05 20:29

Thomas Finnerup wrote:

> Division bør efter min mening ikke være en del af aldersberegning. Jeg
> vil i stedet foreslå dette:

Jeg kan fint sætte mig ind i at din funktion formentlig er bedre i det
givne tilfælde. Fordelen ved en af mig givne - er vist blot at den ikke
er afhængig af felttype. Men pyt være med det - jeg er mere interesseret
i hvad der skulle være problemet i at bruge division?

(læs: det er altid rart at lære lidt) :)

--
Med venlig hilsen
Geert Lund

Thomas Finnerup (22-06-2005)
Kommentar
Fra : Thomas Finnerup


Dato : 22-06-05 21:02

On Wed, 22 Jun 2005 21:29:10 +0200, Geert Lund
<glund-news@post.tele.dk> wrote:

> Men pyt være med det - jeg er mere interesseret i hvad der
> skulle være problemet i at bruge division?

Jeg tror bare ikke at division er pålideligt nok. Ikke at jeg har
gidet at teste, men jeg ser ingen grund til at blande et kommatal ind
i noget, der skal resultere i et heltal.


Venligst
Thomas

Rander (23-06-2005)
Kommentar
Fra : Rander


Dato : 23-06-05 01:45

Wed, 22 Jun 2005 20:13:36 +0200 brugte Thomas Finnerup 22 linier på at
fortælle dette til dk.edb.internet.webdesign.serverside.php:

>Division bør efter min mening ikke være en del af aldersberegning. Jeg
>vil i stedet foreslå dette:
> SELECT
> SUBSTRING(CURRENT_DATE(), 1, 4) -
> SUBSTRING(Tabel.Foedselsdato, 1, 4) -
> (
> SUBSTRING(CURRENT_DATE(), 6, 5) <
> SUBSTRING(Tabel.Foedselsdato, 6, 5)
> )
> AS Alder

Hmmm... Og efter lidt tilpasning fik jeg den til at virke - det var godt
nok ikek noget jeg selv var kommet på...

--
Lars Rander ** Pil ikke ved min adresse ** :(){ :&:& };:
http://rander.dk (temporarily down!)

Det er ikke forureningen, som ødelægger miljøet. Det er
urenhederne i vores luft og vand, som gør det. (Dan Quayle)


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste