Avatar billede martin86 Nybegynder
06. november 2007 - 13:37 Der er 12 kommentarer og
1 løsning

Dato problem, Dato between x og y

Hej Eksperter,

Jeg har et problem med noget datobehandling. Jeg skal have fundet alle de poster i min Sql database der har en værdi mellem dato X og dato Y..

Her er mine kodestump:

X=FormatDateTime(Now, vbShortDate)
Y=FormatDateTime(Now+7, vbShortDate)

SQLkalender="Select * from Kalender where Fra between "&X&" and "&Y&""
Set kalender = Conn.Execute(SQLkalender)
Do while kalender.eof=false


    Response.Write "<tr>"
        Response.Write "<td class='main310' align='center'>"
        Response.Write ""&Kalender("Tekst")&""
        Response.Write "</td>"
    Response.Write "</tr>"

kalender.movenext
Loop


set kalender = nothing
set SQLkalender = nothing

Jeg håber at I kan hjælpe..


vh.
Martin
Avatar billede softspot Forsker
06. november 2007 - 13:40 #1
Hvilken database benytter du?

Hvis det f.eks. er en Access, så vil jeg anbefale dig at bruge de indbyggede funktioner til dato-behandling. Din SQL kunne så se nogenlunde således ud:

SQLkalender="Select * from Kalender where Fra between now() and dateadd('d',7,now())"
Avatar billede softspot Forsker
06. november 2007 - 13:41 #2
Hvis det er en SQL Server er formatet:

SQLkalender="Select * from Kalender where Fra between getdate() and dateadd(day,7,getdate())"
Avatar billede martin86 Nybegynder
06. november 2007 - 13:49 #3
Det er en SQL database. Hvis jeg bruger flg.:
SQLkalender="Select * from Kalender where Fra between getdate() and dateadd(day,7,getdate())"

Så får jeg flg. fejl:
ADODB.Recordset.1 (0x80004005)
SQLState: 37000 Native Error Code: 1064 [MySQL][ODBC 3.51 Driver][mysqld-4.1.11-Debian_4sarge7-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '() and dateadd(day,7,getdate())' at line 1
kalender.asp, line XX
Avatar billede fennec Nybegynder
06. november 2007 - 13:54 #4
Problemet med at benytte indbyggede funktioner er at et database skifte er meget besværlig. Men hvor ofte gør man lige det alligevel :o)

Løsningen på det er at formatere datoerne i ASP:

function DBDate(fDate)
  DBDate = "#"& right("0"&month(fDate),2) &"-"& right("0"&day(fDate),2) &"-"& year(fDate) &"#"
end function

SQLkalender="Select * from Kalender where Fra between "& DbDate(X) &" and "& DBDate(Y) &""

Den jeg har vist er til Access. Er det til f.eks Ms-SQL ændre man bare:
DBDate = "#"& right("0"&month(fDate),2) &"-"& right("0"&day(fDate),2) &"-"& year(fDate) &"#"

til:
DBDate = "'"& year(fDate) & right("0"&month(fDate),2) & right("0"&day(fDate),2) &"'"

MySQL bruger man:
DBDate = "'"& year(fDate) &"-"& right("0"&month(fDate),2) &"-"& right("0"&day(fDate),2) &"'"
Avatar billede martin86 Nybegynder
06. november 2007 - 13:55 #5
fennec - så hvordan ville min kilde kode så se ud?
Avatar billede softspot Forsker
06. november 2007 - 13:55 #6
OK, så er det en MySQL Server (der er relevante forskelle på om det er en SQL Server eller en MySQL server, selvom navnet ligger tæt på :)).

Den kender jeg desværre ikke lige formatet af den ønskede funktionalitet til, så der må du i referencemanualen eller vente til der kommer et bud fra en anden bruger :)
Avatar billede fennec Nybegynder
06. november 2007 - 13:56 #7
Med MySQl's indbyggede funktion vil det bliver:

SQLkalender="Select * from Kalender where Fra between date() and date_add(date, interval 7 days)"
Avatar billede fennec Nybegynder
06. november 2007 - 13:58 #8
Med min funktione ville koden blive:

function DBDate(fDate)
  DBDate = "'"& year(fDate) &"-"& right("0"&month(fDate),2) &"-"& right("0"&day(fDate),2) &"'"
end function


X = date()
Y = date()+7

SQLkalender="Select * from Kalender where Fra between "& DBDate(X) &" and "& DbDate(Y) &""
Set kalender = Conn.Execute(SQLkalender)
Do while kalender.eof=false


    Response.Write "<tr>"
        Response.Write "<td class='main310' align='center'>"
        Response.Write ""&Kalender("Tekst")&""
        Response.Write "</td>"
    Response.Write "</tr>"

kalender.movenext
Loop

Jeg er ikke sikker på om du vil køre på timer/min, for mine eks kører kun på datoen.
Avatar billede fennec Nybegynder
06. november 2007 - 13:59 #9
Avatar billede softspot Forsker
06. november 2007 - 14:01 #10
Det er vist en større diskussion om man skal formatere dato'er i ASP eller i databasen og om man skal bruge native eller generisk kode (kan man egentlig det!? på et eller andet niveau skal man tage stilling til den konkrete database man arbejder med, så det er bare et spørgsmål om hvor meget man vil pakke tingene ind og det afhænger jo igen af hvilken opgave man skal løse).

Princippielt er jeg uenig i at det er lettere at for formatere datoer i ASP, for du skal have flettet dem sammen med SQL'en alligevel og der er forskellige formater for hvordan dato'er håndteres. Endvidere risikere man at tingene falder sammen når man skifter fra et sprog til et andet, hvor datoformaterne typisk også skifter - så er det noget bras at sidde med en streng som skal fortolkes på udførslestidspunktet! Jeg har prøvet det nogle gange, så det er ikke kun baseret på teori ;-)
Avatar billede martin86 Nybegynder
06. november 2007 - 14:04 #11
Fantastisk fennec.... smid et svar!
Avatar billede fennec Nybegynder
06. november 2007 - 14:13 #12
softspot >>
Jeg er fuldt enig i at har man muligheden burde man bruge de indbyggede funktioner, men man skal være klar over problemerne, hvis man vil skifte engang i fremtiden, hvilket ofte sker, hvis man bruger Access.

Nu sidder jeg selv og laver kode hvor kunderne faktisk selv kan vælge hvilken database de vil bruge (Access eller MS-SQL), fordi de både kan få det i en hostet løsning (Ms-SQL) eller en privat løsning (Access). Snart tilbyder vi også en MySQL løsning, som faktisk kører nu, fordi vi bare ændre DBDate. Funktionen er dog lidt mere advanceret da den kører ud fra en config fil, men grundideen er den samme.
Avatar billede fennec Nybegynder
06. november 2007 - 14:14 #13
.o) <-- One Eyed Jack
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