|
| 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)
| |
|
|