Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 10:56 Der er 16 kommentarer og
1 løsning

Hiv fødselsdag/alder ud fra mysql

Jeg forsøger at hive noget alder ud på brugere og har dertil fundet noget kode her på eksperten, men kan ikke få det til at klinge. Det foregår via min og max alder via rullelister.

Koden ser sådan her:
idag=now()
fraalder = dateadd("yyyy",0-Request("alder_max"),idag)
tilalder = dateadd("yyyy",0-Request("alder_min"),idag)

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & fraAlder & "' AND '" & tilAlder & "'")

fdag (fødselsdag) har formatet 1999-12-03 (3. december 1999) og min db er mysql, hvor feltet er date.

Jeg har prøvet at erstatte ' disse tegn med #, men står nu på bar bund, er der nogen eksperter som har et bud?

mvh S
Avatar billede tjp Mester
13. september 2011 - 12:08 #1
Hvad med?:
Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & Format$(fraAlder, "yyyy-mm-dd")
& "' AND '" & Format$(tilAlder, "yyyy-mm-dd")
& "'")
Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 12:18 #2
var det ikke php, dit forslag? virkede ikke, men jeg fjerne § og prøvede med denne kode:


Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & Format(fraAlder, "yyyy-mm-dd")
& "' AND '" & Format (tilAlder, "yyyy-mm-dd") & "'LIMIT " & intStart & ", " & intPageSize & ";")
")

men uden held, har du et forslag?
Avatar billede showsource Seniormester
13. september 2011 - 13:25 #3
En sql:

SELECT COUNT(*) AS records From bruger WHERE (YEAR(CURDATE())-YEAR(fdag))-(RIGHT(CURDATE(), 5)<RIGHT(fdag, 5)) BETWEEN 20 AND 30
Avatar billede tjp Mester
13. september 2011 - 13:25 #4
Næ, det sku da gerne være VB6/VBA.

Hvad virkede ikke og får du nogen fejlmeddelelser?

Jeg har forstået det rigtigt, at du vil ha en Date formatteret til en yyyy-mm-dd streng?

Du er tilfældigvis ikke i VB Script?

Så kan følgende måske bruges?:

strFraAlder = datepart("yyyy", fraalder) & "-" & datepart("m", fraalder) & "-" & datepart("d", fraalder)
strTilAlder = datepart("yyyy", tilalder) & "-" & datepart("m", tilalder) & "-" & datepart("d", tilalder)

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'")
Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 14:37 #5
tjp.
Beklager, jeg kludrede lige lidt i det, første forslag fik jeg denne fejlbesked:

Invalid character
Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & Format$(fraAlder, "yyyy-mm-dd")& "' AND '" & Format$(tilAlder, "yyyy-mm-dd") & "'")


og så prøvede jeg dit andet forslag og fik denne fejlbesked:

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

page.asp, line 49

denne linie: <td width="31%">&nbsp;<a href="page.asp?sid=<%=objRs("brugernavn")%>"><%=objRs("brugernavn")%></a></td>

og her tænker jeg, at det må beror på, at request alder_min og alder_max ikke er i koden, som er i sin fulde længde herunder:

<%

idag=now()

strFraAlder = datepart("yyyy", fraalder) & "-" & datepart("m", fraalder) & "-" & datepart("d", fraalder)
strTilAlder = datepart("yyyy", tilalder) & "-" & datepart("m", tilalder) & "-" & datepart("d", tilalder)

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'")

intRecords = clng(objRs("records"))
objRs.Close
Set objRs = Nothing

intPage = Request.QueryString("page")
if intPage = "" OR not isNumeric(intPage) then
intPage = 1
else
intPage = intPage
end if
intPageSize = 5
intStart = intPage*intPageSize
intStart = intStart-intPageSize
intPages = (intRecords/intPageSize)+1

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'LIMIT " & intStart & ", " & intPageSize & ";")

if objRs.EOF or objRs.BOF then
Response.Write "Ingen poster"
else
%>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">

<%
Do while not objRs.EOF
%>
<tr>
<td width="31%">&nbsp;<a href="page.asp?sid=<%=objRs("brugernavn")%>"><%=objRs("brugernavn")%></a></td>
<td width="31%"><%=objRs("fdag")%><%=objRs("fdag")%></td>
</tr>
<%
objRs.movenext
loop
%>
</table>
<%
end if

objRs.Close
Set objRs = Nothing

response.write "<br>"
For i = 1 to intPages
if i = intPage then
Response.Write "<b>" & i & "</b> "
else
Response.Write "<a href=""page.asp?alder_min="&request("alder_min")& "&alder_max=" & request("alder_max") & "&sideid=4&page=" & i & """>"
Response.Write i
Response.Write "</a> "
end if
next
%>
Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 14:57 #6
showsource

jeg prøve dit forslag, koden ser sådan ud:

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE (YEAR(CURDATE())-YEAR(fdag))-(RIGHT(CURDATE(), 5)<RIGHT(fdag, 5)) BETWEEN 20 AND 30 "'")

men jeg får denne fejl: Expected ')'

mvh. S
Avatar billede tjp Mester
13. september 2011 - 16:08 #7
Nåe, det er ASP. Så burde ? jo være stillet under:
» Forside» Spørgsmål og Svar» Programmering» Script» ASP

Hverken Format$ eller Format findes i ASP og VBS..

Har du prøvet at lave en 'Response.Write' på:

"SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'"

bare lige for at tjekke om den ser korrekt ud?

#5:
Fejlen skyldes at du søger et navn der ikke findes i dit dataset. Måske fordi det er en SELECT COUNT(*)...

#6:
Det er de sidste '"'")' der giver fejl.
Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 16:18 #8
Ja, jeg får request alder_min + alder_max med, det er testet med response.write og koden virker også ok ifm jeg f.eks hiver amter ud osv. Knasten er dette dato-halløj.

Select Count bruger jeg jo til paging.

Beklager, havde overset at forummet var det forkerte, har du en løsning eller skal jeg flytte spørgsmålet?

Mvh S
Avatar billede showsource Seniormester
13. september 2011 - 16:46 #9
Hmm, nu er jeg til php, men en sql burde vel egentlig være ens, uanset sprog ?

Mit forslag virker fint hos mig.
Avatar billede tjp Mester
13. september 2011 - 17:42 #10
Fejlen:

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

har såvidt jeg kan se ikke meget med dato-tingen at gøre. Hvor er det du Select'er de felter du spørger efter? Burde der ikke være en SELECT * et sted (eller en SELECT feltnavn1, feltnavn2 osv.)?

#9:
SQL'en fejler vist fordi der er kommet lidt 'ekstra' på efter 'BETWEEN 20 AND 30', se #6
Avatar billede sunnyboy_55 Nybegynder
13. september 2011 - 18:00 #11
koden ser præcis ud som i #5 efter dit forslag. Hvis jeg søger på andet, har jeg ingen problemer.

i startspørgsmålet kan jeg regne dato koden ud, men scriptet er vist til en access db, og jeg har i hvert fald ikke kunne få den til at virke i mysql.
så jeg kan ikke på om der burde være flere selecter end der er i koden.
hvorfor skal det være så svært:-)
Avatar billede tjp Mester
14. september 2011 - 00:10 #12
Prøv evt at skifte:

Set objRs = Conn.Execute("SELECT COUNT(*) AS records From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'LIMIT " & intStart & ", " & intPageSize & ";")

ud med:

Set objRs = Conn.Execute("SELECT * From bruger WHERE fdag BETWEEN '" & strFraAlder & "' AND '" & strTilAlder & "'LIMIT " & intStart & ", " & intPageSize & ";")
Avatar billede sunnyboy_55 Nybegynder
14. september 2011 - 07:50 #13
det gør jeg gerne, men skal koden her:

strFraAlder = datepart("yyyy", fraalder) & "-" & datepart("m", fraalder) & "-" & datepart("d", fraalder)
strTilAlder = datepart("yyyy", tilalder) & "-" & datepart("m", tilalder) & "-" & datepart("d", tilalder)

ikke også ændres, lidt af den oprindelige kode:

fraalder = dateadd("yyyy",0-Request("alder_max"),idag)
tilalder = dateadd("yyyy",0-Request("alder_min"),idag)

så alder_max og alder_min bliver læst?

mvh S
Avatar billede sunnyboy_55 Nybegynder
14. september 2011 - 10:06 #14
jeg har forsøgt blot at hive fdag ud i en løkke uden paging, for at se om det var muligt, og det lykkedes med denne kode:

SQLstmt = "Select * from bruger WHERE fdag BETWEEN '" & ("1970-12-12") & "' AND '" & ("1990-12-12") & "'"

i min db står dato som 1970-12-19 i formatet date.
kan problemet være, at dato skal vendes?
mvh. S
Avatar billede tjp Mester
14. september 2011 - 10:45 #15
Hov, havde ikke set at du havde fjernet din oprindelige dato-beregning. Den skal med før min tilføjelse (som netop vender dato til yyyy-mm-dd):

fraalder = dateadd("yyyy",0-Request("alder_max"),idag)
tilalder = dateadd("yyyy",0-Request("alder_min"),idag)
strFraAlder = datepart("yyyy", fraalder) & "-" & datepart("m", fraalder) & "-" & datepart("d", fraalder)
strTilAlder = datepart("yyyy", tilalder) & "-" & datepart("m", tilalder) & "-" & datepart("d", tilalder)
Avatar billede sunnyboy_55 Nybegynder
14. september 2011 - 11:02 #16
Beklager, troede den gamle kode skulle fjernes, og nu har jeg testet dine foreslående ændringer og sørme om udtrækket ikke virker med pagning og det hele, simpelt hen var super.

Tak for hjælpen og tålmodigheden, fortsat god dag, og smid et svar.

Mvh. S
Avatar billede tjp Mester
14. september 2011 - 23:51 #17
Jamen, velbekomme og her er et svar.. :-)
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