31. maj 2005 - 17:04Der er
12 kommentarer og 1 løsning
3 næste fødselsdag.
Hej. Jeg har rodet lidt med Eagleeye's script til at beregne hvor gammel en bruger er og hvor mange dage til dennes næste fødselsdag. Jeg har ændret lidt i koden og den ser nu ud som i den næstfølgende post...
Mit problem, hvis man da kan kalde det det, er at jeg ønsker en måde hvorpå man kan tage den udregning af dage til en brugers næste fødselsdag og så udvælge de tre nærmestkommende fødselsdage. Jeg ved ikke rigtigt hvordan dette skal kunne lykkes, da tallene jo ændrer sig hver dag og derfor udelukker brugen af database til dette formål(eller hvad?). Jeg har tænkt på om ikke det smarteste ville være at smide brugernes antal dage og deres brugerid i et array på den ene eller anden måde og så herefter udvælge de tre mindste værdier fra dette array, må det jo være. Mit problem er så at jeg ikke ved hvordan jeg skal opbygge dette array og udvælge på baggrund af det(har aldrig arbejdet med denne slags arrays før).
Hvis der er en der kan hjælpe mig med dette ville jeg være meget taknemmelig.
If months < 0 then dato1 = dateAdd("yyyy",-1,dato1) months = Datediff ("m",dato1,date) years = years - 1 End If
dato1 = dateAdd("m",months,dato1) days = Datediff ("d",dato1,date)
If days < 0 then If months > 0 then months = months - 1 Else years = years - 1 months = 11 End If dato1 = dateAdd("m",-1,dato1) days = Datediff ("d",dato1,date) End If
dinStr = years & " år " & months & " måneder " & days & " dage"
If month(sBirthdate1) < month(date) OR (month(sBirthdate1) = month(date) AND day(sBirthdate1) <= day(date)) then sBirthdate1 = DateAdd("y",1,sBirthdate1) End If
DageTilFD = DateDiff("d",date,sBirthdate1)
maaned = RS("f_maaned") dag = RS("f_dag") sBirthdate1 = dag & "-" & maaned & "-" & Year(date)
If maaned < int(month(date)) OR (maaned = int(month(date)) AND dag <= int(day(date))) then sBirthdate1 = DateAdd("yyyy",1,sBirthdate1) End If
Har du mulighed for at gemme fødselsdatoen som en dato i din database, i stedet for tre tal? I så fald ville jeg mene at det du forespørger kunne klares med en temmelig enkel SQL sætning...
Jeg har en Mysql database, så jo jeg vil da mene at man godt kan gemme en dato. Du tænker på om man bare kan sammenligne dags dato med fødselsdatoen? Jeg ved ikke hvordan du vil lave forespørgslen, for jeg vil gerne stadigvæk have udskrevet antallet af dage til de næste fødselsdage. Og jeg kan ikke se hvordan du vil lave en forespørgsel der henter dem som har fødselsdag om kortest dage, da du jo i databasen kun kan hente på baggrund af fødseldatoen og ikke hvor mange dage der er tilbage... Men jeg tager måske fejl.
Det var ikke megen hjælp jeg rendte ind i... men så er det jo godt at jeg har fundet min egen løsning. Jeg har fjernet det fra eagleeye's kode som jeg ikke skulle bruge og har etableret det man kan kalde for en transit-tabel i min database. Jeg ved ikke helt om det er det smarteste, for i min verden virker det lidt som overkill at bruge en tabel til så lille en ting. Men hvis der nu er andre der får brug for noget ala mit system smider jeg lige koden her.
brugerSQL = "SELECT * FROM klasse_brugere ORDER by f_aar DESC" sletSQL = "TRUNCATE TABLE klasse_DageTilFD"
Set RS = forbindelse1.execute(brugerSQL) forbindelse1.execute(sletSQL) %>
If month(sBirthdate1) < month(date) OR (month(sBirthdate1) = month(date) AND day(sBirthdate1) <= day(date)) then sBirthdate1 = DateAdd("y",1,sBirthdate1) End If
DageTilFD = DateDiff("d",date,sBirthdate1)
maaned = RS("f_maaned") dag = RS("f_dag") sBirthdate1 = dag & "-" & maaned & "-" & Year(date)
If maaned < int(month(date)) OR (maaned = int(month(date)) AND dag <= int(day(date))) then sBirthdate1 = DateAdd("yyyy",1,sBirthdate1) End If
DageTilFD = DateDiff("d",date,sBirthdate1)
insaetSQL = "Insert into klasse_DageTilFD SET brugerid ="& RS("brugerid") &", dagetilfdag ="& DageTilFD forbindelse1.execute(insaetSQL) RS.movenext LOOP
Top3SQL = "Select klasse_DageTilFD.brugerid, klasse_DageTilFD.dagetilfdag, klasse_brugere.brugernavn From klasse_DageTilFD, klasse_brugere WHERE klasse_DageTilFD.brugerid = klasse_brugere.brugerid ORDER BY dagetilfdag ASC LIMIT 0,3"
Set Top3RS = forbindelse1.execute(Top3SQL) Do while not Top3RS.eof %> <strong>·</strong> <a href=?side=3&bID=<%=Top3RS("brugerid")%>><%=Top3RS("brugernavn")%> - <%=Top3RS("dagetilfdag")%> dage</a><br> <% Top3RS.movenext LOOP
forbindelse1.close set forbindelse1 = nothing set RS = nothing set brugerSQL = nothing Set Top3SQL = nothing Set Top3RS = nothing
Hvis du ligger inde med en bedre løsning er denne stadig meget velkommen!
Du må undskylde jeg ikke fik skreve tilbage i går.
Min anbefaling er stadig at gemme datoer som datoer, og så bruge de funktioner der findes i MySql til at lave de ønskede udtræk. Ved at bruge de eksisterende funktioner får du en langt højere hastighed på dine forespørgsler, for ikke at nævne at alt koden kommer til at stå i én linje.
Jeg kan godt se hvad du mener.. Hvis jeg nu gemte fødselsdatoen som én dato(f_dato) i databasen, kunne min forespørgsel se ud som noget ala det her: "select * from klasse_brugere where f_dato >"& Now &" order by f_dato limit 0,3"
og så lave dags beregningen bagefter... Men det skaber jo nogle problemer når antallet af dage går på tværs af et nyt år vil jeg mene. Jeg ved ikke om det er sådan du har tænkt dig det, men prøv at kom med et eksempel.
Det bliver desværre ikke helt så enkelt som du foreslår :) Problemet er at en dato er incl. årstal så der skal noget mere til...
Kan ikke helt overskue det lige nu, så det kan godt være at jeg i virkeligheden bare skulle have ladet dig være i fred, men jeg er sikker på at det kan gøres i en SQL sætning.
Du kan måske selecte "day of year" for hver fødselsdato og sammenligne denne med dags dato...?
Tænker lige lidt over og tester lidt - vender tilbage senere. :)
SELECT navn, foesdag, IF((DayOfYear(foesdag) < DayOfYear(Now())), DayOfYear(foesdag) + 356, DayOfYear(foesdag))-DayOfYear(Now()) AS diff FROM `venner` ORDER BY diff
WHAM BAM! Den er lidt lang og kringlet og kan muligvis forkortes - men den virker! Følgender er resultatet når jeg kører den på min testdata:
Kaj 1984-09-10 102 Lotte 1978-10-02 123 Benny 1958-11-23 175 Ulla 1967-01-09 213 Jokum 1982-01-30 234 Johan 1971-05-27 351
Du kan så selvfølgelig putte en LIMIT 0,3 på til sidst hvis det er det du ønsker.
Hvis du vil undgå at lave ændringer i din database kan du muligvis skifte DayOfYear(foesdag) ud med DayOfYear(f_aar+'-'+f_maaned+'-'+f_dag) i alt 3 steder. Dette er dog ikke testet, men jeg ville tro at det kunne lade sig gøre :)
Høhø bare lidt kringlet måske... :) Men det ser da fornuftigt ud og sparer serveren for en del. Jeg anede virkelig ikke man kunne lave så meget i en SQL-sætning, men man lærer jo hver dag. Sagen er at jeg skal bruge min hjemmeside til eksamen om en ni dages tid... Så jeg vil lige kigge lidt på den og lege lidt med den. Jeg er bare bange for at den sætning du har der, overstiger lærer og censors programmeringsevner(fatteevne) :)
Men tak for hjælpen mester, jeg smider lige nogle point. Jeg vil da egentlig også påstå at der er andre, der på et tidspunkt kan få brug for noget ala det vi har fundet ud af her. Men endnu engang tak for hjælpen.
Jeg tror jeg har gennemskuet den, men ret mig hvis jeg tager fejl...
Vælg navn, foesdag, hvis dagpååret(fødselsdag) er mindre end dagpååret(nu), så lægges 365(må det være :)) til dagpååret(fødselsdag), uanset om der er blevet lagt 365 til eller ej trækkes dagpååret(nu) fra dagpååret(fødselsdag) og gemmes i variablen diff. Har jeg ret?
Jep, det kunne da godt ske man skulle låne sådan en bog på biblioteket :)
Præcis! Det eneste der ikke er taget højde for er skudår, hvor der vel sagtens burde lægges 366 dage til, men der kan vel ikke ske andet end at den siger "Morten har fødselsdag om 5 dage" når der i virkeligheden er 6 dage til. Og dette problem vil vel at mærke kun opstå i slutningen af et skudår hvor der selectes personer på tværs af årsskiftet... :)
Synes godt om
Ny brugerNybegynder
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.