Avatar billede thomas_b Nybegynder
15. maj 2006 - 15:58 Der er 27 kommentarer og
1 løsning

Fejl i SQL sætning ang. sotering

Hej Eksperter...

Det er ligesom at dette script kun sotere efter datoerne i Databasen og ikke efter ip'en eller værdien: cookie_count

SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE Format(dato, 'dd-mm-yyyy')=#"& FormatDateTime(Now(), 2) &"# OR Format(dato, 'mm-dd-yyyy')=#"& FormatDateTime(Now(), 2) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn,1, 2
log_post = rs("log_post")

SQL = "SELECT count(*) as log_post_unik FROM nytabel2006_statastik_log_unikke WHERE Format(dato, 'dd-mm-yyyy')=#"& FormatDateTime(Now(), 2) &"# OR Format(dato, 'mm-dd-yyyy')=#"& FormatDateTime(Now(), 2) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn,1, 2
log_post_unik = rs("log_post_unik")

Kan det ikke være muligt at der manger nogle () rundt om f.eks. dato-strengen
Håber der er nogle der kan hjælpe med at løse mit problem til det virker...
Avatar billede fennec Nybegynder
15. maj 2006 - 16:29 #1
Snakker vi sortering af dit resultat, for du har slet ikke en "order by" på listen:

SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE Format(dato, 'dd-mm-yyyy')=#"& FormatDateTime(Now(), 2) &"# OR Format(dato, 'mm-dd-yyyy')=#"& FormatDateTime(Now(), 2) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count &" ORDER BY dato, ip, count"
Avatar billede thomas_b Nybegynder
15. maj 2006 - 18:40 #2
Undskyld, Nej...
Jeg mener soteringen mellem de relevante poster og ikke... Jeg for nogle poster ud af databasen jeg slet ikke har bedt om...!

Jeg for efter flere tests kun resultat på denne del af SQL-strengen: WHERE Format(dato, 'dd-mm-yyyy')=#"& FormatDateTime(Now(), 2) &"# OR Format(dato, 'mm-dd-yyyy')=#"& FormatDateTime(Now(), 2) &"#"
Avatar billede fennec Nybegynder
16. maj 2006 - 09:02 #3
Så er det din OR betingelse der skaber problemet. Som en hovedregl skal der altid parenteser i din where hvis du har OR med. AND er nemlig vigtigere end OR og bliver kørt først. Din where bliver fortolket såden (forkorter):
"WHERE (dato=#01-01-2006#) OR (dato=#01-01-2006# AND ip='123.4.5.6' AND count=1)"

Hvor det skulle have været:
"WHERE (dato=#01-01-2006# OR dato=#01-01-2006#) AND ip='123.4.5.6' AND count=1"

Hvorfor har du 2 Format(date...) med. Som du har det her vil du jo matche 2 forskellige datoer (01-05-2006 og 05-01-2006 hvis det er 1. maj). Der er bedre metoder til at komme uden om datoproblematikken. For det første kører Access med mm-dd-yyyy formatet, så du skal bare formatere dine datoer i ASP til det format:

minDato = "05-16-2006"
SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE dato=#"& minDato &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count

Jeg har en funktion til at konvertere til mm-dd-yyyy formatet hvis du vil have den...
Avatar billede thomas_b Nybegynder
16. maj 2006 - 15:17 #4
Men jeg har kigget lidt på det... Kunne det ikke også løses på denne måde...:

dd_nu = Day(Now())
mm_nu = Month(Now())
yy_nu = Year(Now())

WHERE Day(dato) = "& dd_nu &" AND Month(dato) = "& mm_nu &" AND Year(dato) = "& yy_nu &"  ???
Avatar billede fennec Nybegynder
16. maj 2006 - 15:26 #5
Jo, det er også en mulighed, men den kræver mere arbejde af databasen. Du får lige min converter:

Function ConvertToSqlDate(dato)
dim SQLYear,SQLMonth,SQLDay
  SQLYear = Year(dato)
  SQLMonth = Month(dato)
  SQLDay = Day(dato)
  if SQLDay<10 then
    SQLDay = 0&SQLDay
  end if
  if SQLMonth<10 then
    SQLMonth = 0&SQLMonth
  end if
  ConvertToSqlDate = SQLMonth&"-"&SQLDay&"-"&SQLYear
End Function

Din SQL bliver så til:
SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE dato=#"& ConvertToSqlDate(date()) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count
Avatar billede thomas_b Nybegynder
16. maj 2006 - 15:31 #6
Hvad så med de værdier der i forvejen er i databasen ?
Avatar billede fennec Nybegynder
16. maj 2006 - 15:38 #7
Så længe de er er gemt i "dato & klokkeslet" kolonner, er der ingen problemer. Har du derimod gemt dem som almindelig tekst, er det med at få rette op på den fejl så hurtig som muligt. Det giver kun problemer at have datoer som tekst.
Avatar billede thomas_b Nybegynder
16. maj 2006 - 15:41 #8
Og med denne funktion går jeg ikke galt i byen... eller hvad ??? (16/05-2006 15:26:58)
Avatar billede thomas_b Nybegynder
16. maj 2006 - 17:30 #9
Der kommer 0 ud som resultat...!
Avatar billede thomas_b Nybegynder
16. maj 2006 - 20:15 #10
Kan det passe at den siger dette...?
Type mismatch: 'ConvertToSqlDate'
Avatar billede fennec Nybegynder
17. maj 2006 - 08:31 #11
Hvordan ser din SQL opbygning ud nu??
Avatar billede thomas_b Nybegynder
17. maj 2006 - 15:20 #12
Den ser således ud...:

Function ConvertToSqlDate(dato)
dim SQLYear,SQLMonth,SQLDay
  SQLYear = Year(dato)
  SQLMonth = Month(dato)
  SQLDay = Day(dato)
  if SQLDay<10 then
    SQLDay = 0&SQLDay
  end if
  if SQLMonth<10 then
    SQLMonth = 0&SQLMonth
  end if
  ConvertToSqlDate = SQLMonth&"-"&SQLDay&"-"&SQLYear
End Function

SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE dato=#"& ConvertToSqlDate(date()) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn,1, 2
log_post = rs("log_post")

SQL = "SELECT count(*) as log_post_unik FROM nytabel2006_statastik_log_unikke WHERE dato=#"& ConvertToSqlDate(date()) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn,1, 2
log_post_unik = rs("log_post_unik")
Avatar billede fennec Nybegynder
17. maj 2006 - 15:43 #13
Det burde da virke fint. Eneste problem jeg kan se er hvis du har en variabel der hedder "dato". Prøv evt at ændre funktionen til dette:

Function ConvertToSqlDate(SQLdato)
dim SQLYear,SQLMonth,SQLDay
  SQLYear = Year(SQLdato)
  SQLMonth = Month(SQLdato)
  SQLDay = Day(SQLdato)
Avatar billede thomas_b Nybegynder
17. maj 2006 - 16:26 #14
Den kommer stadig med resultat der hedder 0
Avatar billede fennec Nybegynder
17. maj 2006 - 16:48 #15
Prøv så lige at udskrive din SQL-streng til skærmen:

response.write "SQL: "& SQL
rs.Open SQL, Conn,1, 2

Hvad siger den??
Avatar billede thomas_b Nybegynder
17. maj 2006 - 19:11 #16
SQL: SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE dato=#05-17-2006# AND ip='183.72.194.12' AND count=10

SQL: SELECT count(*) as log_post_unik FROM nytabel2006_statastik_log_unikke WHERE dato=#05-17-2006# AND ip='183.72.194.12' AND count=10
Avatar billede fennec Nybegynder
18. maj 2006 - 09:20 #17
Den SQL er god nok. Så det må være fordi der ikke er data i tabellen som passer på de 3 kriterier. Tjek lige din data, jeg er sikker på at du ikke har nogle rækker der passer, hvorfor du får 0 :o)
Avatar billede thomas_b Nybegynder
19. maj 2006 - 14:58 #18
Min database ser således ud...:

Kolonne:ip (type: teskt)
Kolonne:count (type: tal)
Kolonne:dato (type: dato og klokkeslet)

De indeholder f.eks.:
ip - "183.72.194.12"
count - "10"
dato - "15-05-2006 21:11:37"
Avatar billede -mundi- Nybegynder
19. maj 2006 - 15:01 #19
prøv at sætte count i [] altså [count] , kunne forestille mig det giver problemer da der er et reserveret ord
Avatar billede thomas_b Nybegynder
19. maj 2006 - 15:05 #20
-mundi- -> det hjælper ikke den udskriver stadig 0 på <%=log_post%>
Avatar billede thomas_b Nybegynder
19. maj 2006 - 15:19 #21
Men hvorfor kan det ikke lade sig gøre på denne måde ?

dd_nu = Day(Now())
mm_nu = Month(Now())
yy_nu = Year(Now())

WHERE Day(dato) = "& dd_nu &" AND Month(dato) = "& mm_nu &" AND Year(dato) = "& yy_nu &"  ???
Avatar billede thomas_b Nybegynder
20. maj 2006 - 00:46 #22
Jeg har brugt min egen metode... 19/05-2006 15:19:34

Tak for jeres hjælp, men denne gang har den ikke lige rigtig hjulpet..! desvære ikke på min server...
Avatar billede fennec Nybegynder
22. maj 2006 - 09:02 #23
Min metode virker ikke fordi du har hh:mm:ss med på dine rækker. Den vil derfor kun give et resultat på de rækker hvor klokken er 00:00:00. En løsning kunne være at lave det sådan:

SQL = "SELECT count(*) as log_post FROM nytabel2006_statastik_log WHERE dato>=#"& ConvertToSqlDate(date()) &"# and dato<#"& ConvertToSqlDate(date()+1) &"# AND ip='"& Request.ServerVariables("REMOTE_ADDR") &"' AND count="& cookie_count

Der er ikke noget galt med at bruge din egen metode, den kræver bare lidt mere computer kraft :o)

Husk også at lukke ?'et...
Avatar billede thomas_b Nybegynder
22. maj 2006 - 15:26 #24
Jeg ville bare se om du skrev tilbage hvis jeg ventede et par dage...
Men hvis jeg nu har brug for hjælp en anden gang... kan jeg kontakte dig på MSN eller noget...?
Avatar billede fennec Nybegynder
22. maj 2006 - 15:41 #25
Har ikke MSN, men bare smid en kommentar herinde, så får jeg en mail om det...
Men nu er der forlænget weekend, så jeg kan ikke love at jeg kommer forbi der.
Avatar billede thomas_b Nybegynder
22. maj 2006 - 15:47 #26
Det er bare iorden... vil du have point...?
Avatar billede fennec Nybegynder
22. maj 2006 - 15:57 #27
Jeg siger skam ikke nej til point :o)
Avatar billede thomas_b Nybegynder
22. maj 2006 - 16:02 #28
Vers'go
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