/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
SQL, hvordan sammenlignes datoer ?
Fra : Jakob Munck


Dato : 11-01-04 23:59

Jeg har en portal, hvor jeg skal lave en login-statistik og skal derfor
tælle antallet af login for hver dag. Hver gang der er en ny login skal jeg
altså finde ud af, om der er en record for denne dag i forvejen, og det
forsøger jeg (uden held) at skrive sådan:

<%
' angiver d.d. uden timer, minutter og sekunder:
dags_dato = FormatDateTime(Date, 2)

' og her går det galt. Dato er feltet med tidsnagivelse:
SQL = "SELECT * FROM tbBesoeg WHERE dato = dags_dato
Set RS = Conn.Execute(SQL)
'.....
%>

Ovenstående er forkert. Men hvordan skriver jeg så den SQL der skal gøre mig
i stand til at finde den ene record, som gælder for netop i dag?

v.h.
Jakob Munck



 
 
Jens Gyldenkærne Cla~ (12-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 12-01-04 15:45

Jakob Munck skrev:

> ' angiver d.d. uden timer, minutter og sekunder:
> dags_dato = FormatDateTime(Date, 2)

Der findes en funktion i Access (og de fleste andre databaser) der
gør præcis det samme. Det er meget lettere at bruge databasens
indbyggede datofunktioner end at overføre en beregnet værdi fra
asp.


> ' og her går det galt.


*Hvordan* går det galt? I asp-sammenhæng resulterer "noget der går
galt" ofte med en eller anden fejlmeddelelse. Den er ret væsentlig
hvis man skal hjælpe dig videre. Læs gerne artiklen her - der
beskriver hvordan man kan spørge hvis man vil gøre det let for
andre at hjælpe: <http://asp-faq.dk/article/?id=41>.


> SQL = "SELECT * FROM tbBesoeg WHERE dato = dags_dato


Ovenstående vil give en parse-fejl fordi der er et ulige antal
anførselstegn i sætningen. Hvis du vil have oventstående sætning på
plads, skal den skrives som her:

   SQL = "SELECT * FROM tbBesoeg WHERE dato = " & dags_dato

dags_dato er en variabel i asp og skal derfor stå uden for
anførselstegnene. For at sammenkæde den med resten af strengen,
skal man bruge tegnet &.

Det er sikkert ikke nok til at få sætningen på plads - da datoer i
Access skal omkranses af havelåger (#). Men som nævnt øverst, vil
jeg anbefale en helt anden tilgang:

SQL = "SELECT * FROM tbBesoeg WHERE dato = Date()"

Funktionen Date findes både i Access og i Asp. Ved at bruge
databasens datofunktion, slipper du for bekymringer om hvorvidt
datoformatet er korrekt.


NB: Du skrev noget om at du skulle tælle antallet af logins for en
dag. Databaser er ganske gode til at tælle - så hvis du pt. løber
hele postsættet igennem for at finde antallet, kan du spare en
masse ved at bruge databasefunktionen til det.

Linjen her:
   
   SQL = "SELECT COUNT(*) as Antal WHERE dato = Date()"

- vil give én post med ét felt - Antal - der angiver hvor mange
poster der har datofeltet lig med værdien af Date.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jakob Munck (12-01-2004)
Kommentar
Fra : Jakob Munck


Dato : 12-01-04 17:06

Tak for de gode råd. Jeg har nu løst problemet ved at skrive nedenstående
kode, som dels tæller antallet af medlemmer, som indsætter en ny
dato-record, når dagen skifter, og som optæller antallet af logins på den
givne dato. Det hele virker. Men om dette kunne være løst simplere, ved at
lade databasen (Access) udregne, kan jeg ikke gennemskue, og jeg ved jeg
ikke hvordan jeg i givet tilfælde skulle have skrevet koden. Nedenstående
fungerer dog rimelig hurtigt, men jeg er naturligvis modtagelig for forslag
til forbedring:

<%
SQL = "SELECT * FROM tbBesoeg WHERE aar =" & Year(Now()) & " AND maaned=" &
Month(Now()) & " AND dag =" & Day(Now())
Set RS = Conn.Execute(SQL)

if RS.EOF or RS.BOF then

SQL = "SELECT COUNT(*) AS antal_medlemmer FROM tbMedlemmer"
Set RS = Conn.Execute(SQL)
antal_medl = RS("antal_medlemmer")

besoeg = 1
aar = Year(Now())
maaned = Month(Now())
dag = Day(Now())

SQL_insert = "INSERT INTO tbBesoeg (besoeg, aar, maaned, dag, antal_medl)
values ('" & besoeg & "','" & aar & "','" & maaned & "','" & dag & "','" &
antal_medl & "')"
Conn.Execute SQL_insert

else

SQL = "UPDATE tbBesoeg SET besoeg = besoeg + 1 WHERE aar =" & Year(Now()) &
" AND maaned=" & Month(Now()) & " AND dag =" & Day(Now())

Conn.execute(SQL)
end if
'.......
%>

v.h.
Jakob Munck



Jakob Munck (12-01-2004)
Kommentar
Fra : Jakob Munck


Dato : 12-01-04 17:07

Og så glemte jeg vist at sige tak for hjælpen.

Tak.

v.h.
Jakob



Jens Gyldenkærne Cla~ (12-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 12-01-04 23:05

Jakob Munck skrev:

> Tak for de gode råd.

Velbekomme. Du får lige et teknisk råd vedrørende nyhedsgrupperne
først: Det er lettere at læse og besvare dine kommentarer hvis du
følger de gængse retningslinjer for citater - dvs. skriv
kommentarer neden under det du kommenterer (gerne i flere blokke)
og klip overflødige citater væk. Se evt. også min signatur.

> jeg er naturligvis modtagelig for forslag til forbedring:

Jeg skal gerne komme med nogle.


> SQL = "SELECT * FROM tbBesoeg WHERE aar =" & Year(Now()) & "
> AND maaned=" & Month(Now()) & " AND dag =" & Day(Now())

Jeg ville gemme datoen som et datofelt og så skrive:

SQL = "SELECT COUNT(*) as antal FROM tbBesoeg WHERE " & _
" DateDiff('d', Now, datofelt) = 0"


Med din nuværende struktur kan man gøre det lidt enklere således:

SQL = "SELECT COUNT(*) FROM tbBesoeg WHERE aar = Year(Now) " & _
"AND maaned = Month(Now) AND dag = Day(Now)"

Hvis du ikke vil benytte COUNT her, kan du fx skrive:

SQL = "SELECT TOP 1 dag FROM tbBesoeg WHERE aar = Year(Now) " & _
"AND maaned = Month(Now) AND dag = Day(Now)"

- og så tjekke på rs.EOF igen. Det optimerer performance fordi du
højst henter én post og kun ét felt. Du tjekker jo egentlig bare
for eksistensen af poster fra dags dato - derfor er der ingen grund
til at hente dem alle sammen.

> if RS.EOF or RS.BOF then

If rs("antal") = 0 Then

> SQL = "SELECT COUNT(*) AS antal_medlemmer FROM tbMedlemmer"

Her tæller du samtlige medlemmer i tbMedlemmer - men det er måske
også meningen?

> Set RS = Conn.Execute(SQL)

Nu har du "tabt" det første postsæt - for du har ikke længere en
reference til det. Hvis du har flere postsæt åbne ad gangen, bør du
give dem forskellige navne:

Set rsMedlemmer = Conn.Execute(SQL)

(Vil man gøre det rigtig pænt, kan man også give sql-variablerne
mere sigende navne: Conn.Execute(SQLMedlemmer).

Det er vigtigt at beholde referencerne til "dyre" resurser som
postsæt, fordi man ellers ikke kan lukke og slukke efter sig
(rs.close/set rs = nothing).

> besoeg = 1
> aar = Year(Now())
> maaned = Month(Now())
> dag = Day(Now())

Alle disse værdier kunne fint være default-værdier for tabellen.

> SQL_insert = "INSERT INTO tbBesoeg (besoeg, aar, maaned, dag,
> antal_medl) values ('" & besoeg & "','

Registrerer du antal besøg i et tekstfelt? Det er en dårlig ide.
Hvis det er et talfelt, er syntaksen forkert - der skal ikke
anførselstegn om talfelter.


> SQL = "UPDATE tbBesoeg SET besoeg = besoeg + 1

- ah, du registrerer besoeg som et talfelt, fint nok. Men så er der
altså fejl i INSERT-sætningen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jakob Munck (13-01-2004)
Kommentar
Fra : Jakob Munck


Dato : 13-01-04 16:17

Tak igen for gode råd. Jeg tjekker det igennem og indfører forbedringerne i
koden.

v.h.
Jakob



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste