Avatar billede alex15 Nybegynder
12. juni 2008 - 16:17 Der er 34 kommentarer og
1 løsning

Vis de 4 næste personer som har fødselsdag

Hej

Har siddet og brugt en del tid på at finde ud af hvordan jeg kan få de næste 4 personer som har fødselsdag frem på en linje? De "løsninger" som har har tænkt på (i hoved) virker super besværlige.

Så ville høre om der var nogle som kendte nogle "nemme" nogle? eller  liggende?

Min database har følgende rækker:

navn = "char()"
dob = "date"
id = "int()"

Skulle vist være rigeligt.
Avatar billede jakobdo Ekspert
12. juni 2008 - 17:40 #1
SELECT * FROM tabel WHERE dob > NOW() ORDER BY dob ASC LIMIT 4
Avatar billede w13 Novice
12. juni 2008 - 17:49 #2
jakobdo>> Det tænkte jeg også, men det skal vel være ligeglad med året?
Din kode finder vel kun dem, som er født i fremtiden.
Avatar billede alex15 Nybegynder
12. juni 2008 - 17:58 #3
Den er jeg også været inde på. Men som w13 også siger, så finder den jo kun folk som er født i fremtiden? og der kan også blive nogle problemer mht. årsskifte. hvis man siger dob > now() (Hvor fødsels året IKKE indgår). - Hvis i forstår hvad jeg mener.
Avatar billede jakobdo Ekspert
12. juni 2008 - 18:04 #4
Jeg forstår ikke jeres fremtids-ting.
Den skal jo netop vise de næste 4 som har fødselsdag, og det gør den SQL der.
Eller misforstår jeg hvad der spørges til ?
Avatar billede jakobdo Ekspert
12. juni 2008 - 18:04 #5
Ahh, nu forstod jeg! :o)
Avatar billede jakobdo Ekspert
12. juni 2008 - 18:35 #6
Jeg tror sgu den var der:

SELECT *
FROM tbl_834699
ORDER BY
IF(DAY(dob) > DAY(now()),0,1),
IF(MONTH(dob) > MONTH(now()),0,1)
LIMIT 4
Avatar billede showsource Seniormester
12. juni 2008 - 18:52 #7
Eller

SELECT * FROM `tabel`
WHERE
SUBSTR(`dob`, 0,7) > DATE_FORMAT(NOW(), '%Y-%m')
ORDER BY `dob` ASC
LIMIT 0,4

Utestet! :O)
Avatar billede showsource Seniormester
12. juni 2008 - 18:54 #8
Eller

SELECT * FROM `tabel`
WHERE
SUBSTR(`dob`, 0,7) > SUBSTR(DATE(), 0,7)
ORDER BY `dob` ASC
LIMIT 0,4
Avatar billede jakobdo Ekspert
12. juni 2008 - 19:24 #9
Showsource: Din løsning vil ikke virke.
Du sammenligner jo f.eks. 1932-02 med 2008-06
Avatar billede showsource Seniormester
12. juni 2008 - 19:25 #10
Og ?
Avatar billede showsource Seniormester
12. juni 2008 - 19:26 #11
Mig bekendt, vil det virke, men ok, det er utestet! ;O()
Avatar billede showsource Seniormester
12. juni 2008 - 19:30 #12
ups, dagen skal jo også med !
Avatar billede jakobdo Ekspert
12. juni 2008 - 19:43 #13
År skal ikke med, det er kun måned og dag som skal sammenlignes.
Avatar billede showsource Seniormester
12. juni 2008 - 19:53 #14
Ja, selvfølgelig! Mybad.....

Men kanont at krotaien lige har nakket pølsetyskerne! :O)
Avatar billede arne_v Ekspert
12. juni 2008 - 19:55 #15
proev:

SELECT *
FROM tabel
ORDER BY (DAYOFYEAR(dob)-DAYOFYEAR(NOW())+365)%365
LIMIT 4;
Avatar billede arne_v Ekspert
12. juni 2008 - 20:01 #16
DAYOFYEAR sammenligner dag og maaned
+365 %265 haandterer at hvis nu er 31/12 saa kan naeste foedselsdag vaere 1/1
Avatar billede arne_v Ekspert
12. juni 2008 - 20:01 #17
%365
Avatar billede showsource Seniormester
12. juni 2008 - 20:19 #18
Jeg får dobbelt konfekt hvis datoen er 2008-12-27

D.v.s. to af hver ? ( I ex. har jeg to datoer før nytår, og 71 efter nytår )
Avatar billede showsource Seniormester
12. juni 2008 - 20:20 #19
to datoer efter 2008-12-27, men før 2008-12-31 og 71 efter nytår
Avatar billede showsource Seniormester
12. juni 2008 - 20:22 #20
Efter nytår har jeg første dato d. 2. i 1., og bruger jeg 2008-01-01 som start, vises to gange 2008-01-02 ?
Avatar billede alex15 Nybegynder
12. juni 2008 - 20:29 #21
(Kommentar: jakobdo 12/06-2008 18:35:45)
Men her vil dato'en 01/01 jo IKKE være større end f.eks. 23/12?. Eller hvad betyder/gør det der ,0,1), i slutningen af koden 'IF(DAY(dob) > DAY(now()),0,1),'?
Avatar billede jakobdo Ekspert
12. juni 2008 - 20:55 #22
Kan godt se den ikke var god nok, øv...
Avatar billede jakobdo Ekspert
12. juni 2008 - 21:00 #23
Men arne_v's løsning må være den rette:

SELECT *
FROM `tabel`
ORDER BY (DAYOFYEAR(`dob`)-DAYOFYEAR(NOW())+365)%365
LIMIT 4;
Avatar billede alex15 Nybegynder
12. juni 2008 - 23:54 #24
Okay, prøver den lige i morgen.

Selv om jeg ikke lige forstår den der +365)%365?

Hvad er det som det der % gør? samt + for den sag skyld?
Avatar billede arne_v Ekspert
13. juni 2008 - 08:35 #25
% er modulus/remainder operatoren
Avatar billede arne_v Ekspert
13. juni 2008 - 09:13 #26
og hvis vi skal haandtere skudaar korrekt, saa skal det nok vaere 366 og ikke 365
Avatar billede alex15 Nybegynder
13. juni 2008 - 09:24 #27
Den virker jo præcis som den skal. og gal hvor er den meget nemmere end mig løsning.. Var var endnu ikke færdig, og den fyldte allerede ca. 50 linjer ;o)

Lige én ting, ved godt at jeg skrev næste 4 fødselsdage. Men er det muligt at få den til også at vise, hvis en person har fødselsdag idag evt.? - Lige nu viser det nu (som jeg bedte om) de næste 4 fødselsdage. Men kan man også få den til at vise én evt. fødselsdag i dag?
Avatar billede alex15 Nybegynder
13. juni 2008 - 09:31 #28
rettede lige følgende:

ORDER BY (DAYOFYEAR(dob)-DAYOFYEAR(NOW())+366)%365

Og det ser ud som om at det løste problemet med at vise fødselsdagen idag? Er denne løsning okay?

Ps. Da jeg valgte Arne_v løsning synes jeg det er mest fair at point går til ham. Nogle som har noget i mod det?

Arne_v laver du lige et svar?
Avatar billede jakobdo Ekspert
13. juni 2008 - 09:32 #29
Fint nok med mig, han kom jo med en løsning. :o)
Avatar billede jakobdo Ekspert
13. juni 2008 - 09:37 #30
Arne_v, din løsning kan vel ikke tage højde for skudår ?
Nogle gange vil det jo være 365 og andre 366.
Men du kan vel ikke altid bare køre med 366 ?
Du skal vel have årets antal dage, og bruge det.
Avatar billede alex15 Nybegynder
13. juni 2008 - 09:45 #31
Ved at indtaste +366)%365 - Kunne jeg i hvertfald få den til at vise en person som evt. også havde fødseldag i dag.
Avatar billede arne_v Ekspert
13. juni 2008 - 10:02 #32
Jeg tror at 366 virker baade med skudaar og ikke skudaar. For ikke skudaar bliver der
er "hul" for dag 366, men jeg mener at raekkefoelgen stadig er korrekt - altsaa
30/12 giver 1, 31/12 giver 2, 1/1 giver 4 - vi mangler 3 men det goer ikke noget.
Avatar billede arne_v Ekspert
13. juni 2008 - 10:03 #33
svar
Avatar billede alex15 Nybegynder
13. juni 2008 - 10:40 #34
------ Udregn alder ved næste fødselsdag ------

Fik lige lavet (med hjælp fra en anden tråd her inde) følgende kode til at udregne personens fødselsdag næste gang? eller hvis personen har i dag self. Koden ser således ud:

$dato = "".substr($row['dob'], 0,-6).'-'.substr($row['dob'], 5,-3).'-'.substr($row['dob'], 8,11)."";

list($AAAA, $MM, $DD)=explode('-', $dato);

$alder = date("Y") - $AAAA;           
$birth = $MM . $DD;
$idag = date("m") . date("d");

if(substr($row['dob'], 5,-3) < date("m")){ $alder++; } else { $alder; }

---

Ville bare lige smide den her ind, hvis en anden person skulle støde på denne tråd.
Avatar billede alex15 Nybegynder
13. juni 2008 - 11:06 #35
Og til jer andre. 1000 tak for hjælpen. Altid rart at der er folk der gider bruge tid på de problemer som man ikke selv kan løse :o)
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