Avatar billede benhur Nybegynder
31. maj 2005 - 17:04 Der 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.
Avatar billede benhur Nybegynder
31. maj 2005 - 17:05 #1
brugerSQL = "SELECT * FROM klasse_brugere ORDER by f_aar DESC"
Set RS = forbindelse.execute(brugerSQL)
%>

<%
Do while not RS.eof and RS("f_aar") <> "0"

    sBirthdate = RS("f_dag") & "-" & RS("f_maaned") & "-" & RS("f_aar")
    dato1 = sBirthdate
    years = Datediff ("yyyy",dato1,date)
    dato1 = dateAdd("yyyy",years,dato1)
    months = Datediff ("m",dato1,date)

    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"

    sBirthdate1 = RS("f_dag") & "-" & RS("f_maaned") & "-" & RS("f_aar")
    sBirthdate1 = day(sBirthdate1) & "-" & month(sBirthdate1) & "-" & Year(date)

    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)
   
    Response.write RS("fornavn")
    response.write "<br>"
    response.write DageTilFD
    response.write "<br>"
    response.write dinStr &"<p>"
    RS.movenext
    LOOP
   
    forbindelse.close
    set forbindelse = nothing
    set RS = nothing
    set brugerSQL = nothing
   

%>
Avatar billede davidfossil Nybegynder
31. maj 2005 - 17:10 #2
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...
Avatar billede benhur Nybegynder
31. maj 2005 - 17:24 #3
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.
Avatar billede benhur Nybegynder
01. juni 2005 - 01:02 #4
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)
%>

<%
Do while not RS.eof and RS("f_aar") <> "0"

    sBirthdate1 = RS("f_dag") & "-" & RS("f_maaned") & "-" & RS("f_aar")
    sBirthdate1 = day(sBirthdate1) & "-" & month(sBirthdate1) & "-" & Year(date)

    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!


Over and Out
//Benhur
Avatar billede davidfossil Nybegynder
01. juni 2005 - 09:16 #5
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.

Her er nogle links som kan hjælpe dig på vej:

- Overview of Date and Time Types -
http://dev.mysql.com/doc/mysql/en/date-and-time-type-overview.html

- Date and Time Functions -
http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
Avatar billede benhur Nybegynder
01. juni 2005 - 10:55 #6
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.
Avatar billede davidfossil Nybegynder
01. juni 2005 - 17:15 #7
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. :)
Avatar billede davidfossil Nybegynder
01. juni 2005 - 17:37 #8
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
Avatar billede davidfossil Nybegynder
01. juni 2005 - 17:40 #9
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 :)

Var det svar nok? :o)
Avatar billede benhur Nybegynder
01. juni 2005 - 20:11 #10
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.
Avatar billede davidfossil Nybegynder
01. juni 2005 - 23:54 #11
Haha - jeg kan godt give en forklaring (i morgen) hvis du ikke selv kan gennemskue den.

Anyways, man kan faktisk lave RIGTIG mange ting med SQL. Lån en bog på biblioteket ;)
Avatar billede benhur Nybegynder
02. juni 2005 - 11:41 #12
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 :)
Avatar billede davidfossil Nybegynder
02. juni 2005 - 16:24 #13
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... :)
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
Kurser inden for grundlæggende programmering

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