15. maj 2006 - 15:58Der 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...
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"
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) &"#"
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...
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
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.
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")
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)
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)
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...?
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.
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.