Avatar billede sumokadet Nybegynder
22. januar 2003 - 20:04 Der er 6 kommentarer og
1 løsning

Finde de næste fem fødselsdage...

Hej alle derude,

jeg er noget af en novice til PHP/MySQL, så jeg har lige brug for lidt hjælp: Jeg har en MySQL-database med flg. 2 felter:

* person - VARCHAR(50)
* dato - DATE

denne indeholder en bunke personer med deres tilhørende fødselsdatoer, f.eks. "Columbus" med tilhørende fødselsdato 1492-12-10...

Jeg har brug for en SELECT-sætning, der giver mig de næste fem fødseldage fra idag. Og måske også en sætning, der giver mig alle fødselsdage f.eks. 30 dage frem.

Nogen der har et godt bud?
Avatar billede jelzin101 Praktikant
22. januar 2003 - 20:15 #1
de næste 5 dage:

SELECT person, dato from tabel order by dato desc limit 5
Avatar billede sumokadet Nybegynder
22. januar 2003 - 20:21 #2
Tak for kommentaren jelzin101, men du er vist på vildspor - eller også er det mig der ikke har forklaret situationen grundigt nok:

Jeg ønsker at finde de næste fem fødselsdage fra dagen idag.

Altså idag er det den 22. januar 2003... De næste fem fødselsdage kunne være f.eks. 25/1/1982, 28/1/1925, 3/2/1947, 10/2/1950, 20/2/1990...

Altså: de næste fem fødselsdatoer, uafhængig af hvilket år de er i - men der skal tages højde for nytår, sådan så de næste fem fødselsdage efter 31/1/2002 er nogle dage der ligger i januar...

Prøv igen :-)
Avatar billede jelzin101 Praktikant
22. januar 2003 - 20:42 #3
;0) mig der svarede lidt for hurtigt ;) jeg kigger på det.
Avatar billede miraculix Nybegynder
23. januar 2003 - 23:44 #4
Hvormange personer regner du med at få i tabellen?
Avatar billede miraculix Nybegynder
24. januar 2003 - 00:51 #5
Hvad med:

select
  id,
  navn,
  dato,
IF (
  DAYOFYEAR(NOW()) < DAYOFYEAR(DATO) ,
  DAYOFYEAR(DATO) - DAYOFYEAR(NOW()),
  365 - DAYOFYEAR(NOW()) + DAYOFYEAR(DATO)
    ) AS DAGETILDAG
from
  fodselsdage
order by DAGETILDAG LIMIT 5;

Men den er nok ikke god at køre på en database med 300.000 fødselsdage, og der vil også være lidt problemer med skudår, specielt hvis fødselsdagen er den 29/2.

Hvordan skal 29/2 håndteres? Skal den først tælles med næste gang den dukker op? Eller skal man fejre den på den 28/2?
Avatar billede miraculix Nybegynder
24. januar 2003 - 11:00 #6
Nu har jeg fundet på en mere skud(års)sikker udgave, (og endnu tungere og mere uoverskuelig):

select
  id,
  navn,
  dato,
IF (
  DAYOFYEAR( CONCAT( '2004-', MONTH(NOW()),'-', DAYOFMONTH(NOW()) )) <=
    DAYOFYEAR( CONCAT('2004-', MONTH(DATO),'-', DAYOFMONTH(DATO) ))
  ,
  DAYOFYEAR( CONCAT('2004-', MONTH(DATO),'-', DAYOFMONTH(DATO) ))
  -
  DAYOFYEAR( CONCAT( '2004-', MONTH(NOW()),'-', DAYOFMONTH(NOW()) ))
  ,
  366 -
  DAYOFYEAR( CONCAT( '2004-', MONTH(NOW()),'-', DAYOFMONTH(NOW()) ))
  +
  DAYOFYEAR( CONCAT('2004-', MONTH(DATO),'-', DAYOFMONTH(DATO) ))
    ) AS DAGETILDAG
from
  fodselsdage
order by DAGETILDAG LIMIT 5;

Den tager højde for om personen tilfældigvis er født på eller efter 29/2 i et skudår. Personer født 29/2 kommer ud efter dem født d. 28/2 og før dem født 1/3.

(Nå ja, jeg blev lige grebet af opgaven.. Er det til et kursus? ;-) )
Avatar billede sumokadet Nybegynder
19. marts 2003 - 20:30 #7
Så gør jeg lige tråden færdig - tak for hjælpen - du fortjener pointene :-D
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
Computerworld tilbyder specialiserede kurser i database-management

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