Avatar billede Bjarne S. Nielsen Juniormester
20. september 2017 - 11:31 Der er 31 kommentarer

Søge med FormatDateTime

Jeg skal søge mellem 2 tidspunkter...
Jeg har oprettet flg. sql:
Sql="SELECT * FROM tblKalender WHERE Aktivitet=" & Request.Form("D1") & " AND #" & FormatDateTime(FraTid) & "# BETWEEN StartTid AND SlutTid"

StartTid og SlutTid er Standard Dato og Klokkeslæt felter i databasen...

Det ser ud som om, der byttes rundt på dag og måned...

FormatDateTime viser vel mm/dd/yyyy hh:mm:ss...???
Avatar billede softspot Forsker
20. september 2017 - 12:47 #1
Det afhænger af hvilket format du anvender. FormatDateTime har 5 forskellige formater du kan vise dine datoer i (se her: https://www.w3schools.com/asp/func_formatdatetime.asp).

Hvis du vil anvende strengsammensætte SQL-sætninger (hvilket ikke kan anbefales aht. SQL injections), så bør du nok satse på at formatere dine datoer således:

yyyy-mm-dd hh:nn:ss

Det plejer at fungere.

En bedre metode er, at anvende parameteriserede forespørgsler vha. ADODB.Command (tror jeg nok). Jeg begik engang en guide i brugen af parameteriseret tilgang til databaser, som du kan finde her: https://www.computerworld.dk/uploads/eksperten-guider/1250-Parameterisering-af-databasekald-med-ASP-og-ADO.pdf

En quick and dirty metode kunne være:

dim cmd, rs
set cmd = Server.CreateObject("ADODB.Command")
set cmd.Connection = dinConnection
cmd.CommandText = "SELECT *  FROM tblKalender WHERE Aktivitet=?" & _
        " AND ? BETWEEN StartTid AND SlutTid"
cmd.CommandType = adCmdText
set rs = cmd.Execute(Array(Request.Form("D1"), FraTid))
' Læs dine resultater fra variablen rs...

dinConnection er den aktive forbindelse til databasen.
Avatar billede softspot Forsker
20. september 2017 - 12:49 #2
Ups! Der skal lige et komma ind foran array'et i Execute-kommandoen:

set rs = cmd.Execute(Array(, Request.Form("D1"), FraTid))
Avatar billede Bjarne S. Nielsen Juniormester
25. september 2017 - 09:14 #3
Har prøvet med format yyyy-mm-dd hh:nn:ss
og din quick and dirty
desværre uden held...:(

Det er udelukkende selve datoen, der er problemet...
Dato 10-06-2017 bliver til 06-10-2017
Ingen problemer når det er 23-09-2017 - så virker det...
Avatar billede softspot Forsker
25. september 2017 - 09:24 #4
Prøv evt. med:

set rs = cmd.Execute(Array(, Request.Form("D1"), CDate(FraTid)))
Avatar billede Bjarne S. Nielsen Juniormester
25. september 2017 - 10:40 #5
Fejl:
Objektet understøtter ikke denne egenskab eller metode: 'Connection'
Avatar billede softspot Forsker
25. september 2017 - 10:56 #6
Denne linje skal ændres:

set cmd.Connection = dinConnection

til:

set cmd.ActiveConnection = dinConnection

Jeg kan anbefale at du tager eksemplerne fra den guide jeg har linket til.
Avatar billede Bjarne S. Nielsen Juniormester
25. september 2017 - 13:30 #7
Aktivitet =1
FraTid=16-10-2017 01:00:00     
SELECT * FROM tblKalender WHERE Aktivitet = ? AND ? BETWEEN StartTid AND SlutTid
Microsoft JET Database Engine fejl '80040e10'

Der er ikke angivet nogen værdi for en eller flere krævede parametre.

/polymeren/administrator/kalender.asp, linje 45

linje 45 = "set rs = cmd.Execute(Array(, Request.Form("D1"), CDate(FraTid)))"
Avatar billede softspot Forsker
25. september 2017 - 13:47 #8
Det er da også mig der har fået sat komme det forkerte sted. Prøv denne i stedet:

set rs = cmd.Execute(, Array(Request.Form("D1"), CDate(FraTid)))
Avatar billede Bjarne S. Nielsen Juniormester
26. september 2017 - 14:23 #9
Næj...det funker ikke...
Så snart der er en dato, der kan fortolkes på 2 måder (06-07-2017 og 07-06-2017) så kokser det...
Tidspunktet (15:10:30) fungerer fint...
Avatar billede softspot Forsker
26. september 2017 - 14:31 #10
Prøv lige at vise den kode der ikke fungerer for dig.
Avatar billede Bjarne S. Nielsen Juniormester
26. september 2017 - 14:47 #11
Det er svjks det inderste loop, der fejler...

FraDato = Day(Request.Form("T2")) & "-" & Month(Request.Form("T2")) & "-" & Year(Request.Form("T2"))
TilDato = Day(Request.Form("T10")) & "-" & Month(Request.Form("T10")) & "-" & Year(Request.Form("T10"))

Do Until cDate(FraDato) > cDate(TilDato)
x=0
    FraTid = FraDato & " " & Left(Request.Form("D2"),2) & ":00:00"
    TilTid = TilDato & " " & Left(Request.Form("D3"),2) & ":00:00"
   
    Do Until FormatDateTime(FraTid,4) > FormatDateTime(TilTid,4)
        Sql="SELECT * FROM qryKalender WHERE Aktivitet=" & Request.Form("D1") & " AND #" & FraTid & "# BETWEEN StartTid AND SlutTid"
        RS.Open Sql, Conn, 3, 3
        If RS.EOF = False Then
            x = 1
            Optaget = Optaget & FraDato & "<br>"
            RS.Close
            Exit Do
        End If
        RS.Close
        FraTid = DateAdd("h",1,FraTid)
    Loop
   
If x = 0 Then   
    Sql="INSERT INTO tblKalender(SerieID,Aktivitet,KalenderDato,KalenderStart,KalenderBegivenhed,KalenderSlut,KontaktPerson,KontaktTlf,DokLink,VisesPåHjemmesiden,StartTid,SlutTid)" &_
    " VALUES(" & Serie & "," & Request.Form("D1") & ",'" & FraDato & "','" & Request.Form("D2") & "','" & Request.Form("S1") & "','" & Request.Form("D3") &_
    "','"  & Request.Form("T6") & "','" & Request.Form("T7") & "','" & Request.Form("T8") & "'," & IIF(Request.Form("C2")="ON",-1,0) &_
    ",'" & FraDato & " " & Request.Form("D2") & "','" & FraDato & " " & Request.Form("D3") & "');"
    response.write sql & "<br>"
    Conn.Execute(Sql)
End If
   
FraDato = DateAdd("d",7,FraDato)
FraDato = Day(FraDato) & "-" & Month(FraDato) & "-" & Year(FraDato)
'response.write FraDato & FraTid & "<br>"
Loop
Avatar billede softspot Forsker
26. september 2017 - 15:46 #12
OK, men det gør jo heller ikke brug af noget som helst af det jeg har foreslået. Jeg havde jo en forventning om, at du rent faktisk forsøgte at implementere det jeg har skrevet om og at det var det vi arbejdede med... :-/

Du har ikke engang implementeret ÅR-MÅNED-DAG formatet (som jeg vil tro løser problemet med datoen). Kunne du i det mindste ikke prøve det og så vise den kode du kommer frem til? Du må også gerne være specifik i forhold til, hvad du får af respons fra systemet i stedet for bare at sige "det ikke virker". Det er overordentlig svært at hjælpe dig videre, hvis du ikke giver den fornødne information og giver de ting man foreslår en chance...
Avatar billede softspot Forsker
26. september 2017 - 15:55 #13
Umiddelbart bør du konvertere fra- og tildatoerne til datotypen fra starten og så arbejde med datotypen resten af vejen. Det vil isolere evt. problemer med datokonvertering til et sted i koden i stedet for alle steder, hvor du skal kalde CDate for at arbejde med datoer.

Ydermere virker det relativt ineffektivt, at lave databaseopslag i en løkke. Du må kunne gruppere opslaget i tidsintervaller og så iterere over resultaterne istedet. Så vil du  spare en masse tid (læs: din kode vil køre hurtigere).

Desuden er der stadig et stort problem med at strengsammensætte på den måde som du gør. Din kode er meget sårbar overfor input som er i et uønsket format.

Hvilken database anvender du?
Avatar billede softspot Forsker
26. september 2017 - 16:02 #14
Det kunne også være godt, hvis du lige ridsede op, hvilke data denne kode bliver fodret med og hvad det er du forsøger at gøre, samt på hvilken datastruktur dette skal ske.
Avatar billede Bjarne S. Nielsen Juniormester
04. oktober 2017 - 11:43 #15
Med  ÅR-MÅNED-DAG mener du så  ÅR-MÅNED-DAG hh:nn:ss...?

Jo, jeg har prøvet de 2 løsninger du ridsede op...
har også haft yyyy-mm-dd formatet på...

Men det er denne kode, der giver de fleste svar...
Dog, så snart datoen kan fortolkes "forkert" bliver den det...:/

Det er en Access database...

Forespørgslen fodres med et tal, og en dato som kriterie...

Det indre loop kigger på om tidspunkt er mellem tidspunkter på valgte datoer...

Går ud fra, at det er en Standard datoformat i tabeldesignet, altså dd-mm-yyyy hh:nn:ss...
Skal det konverteres til yyyy-mm-dd hh:nn:ss i forespørgslen...?

Sorry, hvis jeg ikke forklarer godt nok - spørg endelig...:)
Avatar billede softspot Forsker
04. oktober 2017 - 13:03 #16
Det grundlæggende problem er, at din database bruger engelsk datoformat og din kode bruger dansk format. Det letteste ville derfor nok være, at formatere din dato som en engelsk dato når du arbejder med datoer i databasen.

engelsk formet er mm/dd/yyyy
dansk format er dd/mm/yyyy
Avatar billede Bjarne S. Nielsen Juniormester
04. oktober 2017 - 13:52 #17
Ja, jeg er godt klar over problematiken med engelsk dato...det har jeg også prøvet, men uden det ønskede resultat...:(
Avatar billede softspot Forsker
04. oktober 2017 - 16:03 #18
Prøv dette (copy/paste det hele):

FraDato = CDate(Year(Request.Form("T2")) & "-" & Month(Request.Form("T2")) & "-" & Day(Request.Form("T2")))
TilDato = CDate(Year(Request.Form("T10")) & "-" & Month(Request.Form("T10")) & "-" & Day(Request.Form("T10")))

' OPSÆT command-objekt til forespørgsel
Sql = "SELECT * " & _
      "FROM qryKalender " & _
      "WHERE Aktivitet=? " & _
      "AND ? BETWEEN StartTid AND SlutTid"

set cmdSel = Server.CreateObject("ADODB.Command")
cmdSel.CommandText = sql
set cmdSel.ActiveConnection = Conn

' OPSÆT command-objekt til indsættelse
Sql = "INSERT INTO " & _ 
      "tblKalender(SerieID,Aktivitet,KalenderDato,KalenderStart," & _
      "KalenderBegivenhed,KalenderSlut,KontaktPerson," & _
      "KontaktTlf,DokLink,VisesPåHjemmesiden,StartTid,SlutTid) " &_
      " VALUES(?,?,?,?,?,?,?,?,?,?,?,?)"

set cmdIns = Server.CreateObject("ADODB.Command")
cmdIns.CommandText = sql
set cmdIns.ActiveConnection = Conn

Do Until FraDato > TilDato
    x=0
    FraTid = DateAdd("h", CInt(Left(Request.Form("D2"),2)), FraDato)
    TilTid = DateAdd("h", CInt(Left(Request.Form("D3"),2)), TilDato)
   
    Do Until FraTid > TilTid
        set rs = cmdSel.Execute(, Array(Request.Form("D1"), FraTid)
        If not rs.EOF Then
            x = 1
            Optaget = Optaget & FraDato & "<br>"
            rs.Close
            Exit Do
        End If
        rs.Close
        FraTid = DateAdd("h",1,FraTid)
    Loop
   
    If x = 0 Then   
        parametre = array( _
                  Serie, _
                  Request.Form("D1"), _
                  FraDato, _
                  Request.Form("D2"), _
                  Request.Form("S1"), _
                  Request.Form("D3"), _
                  Request.Form("T6"), _
                  Request.Form("T7"), _
                  Request.Form("T8"), _
                  IIF(Request.Form("C2")="ON",-1,0), _
                  FormatDateTime(FraDato,2) & " " & Request.Form("D2"), _
                  FormatDateTime(FraDato,2) & " " & Request.Form("D3"))

        cmdIns.Execute(, parametre)
    End If
   
    FraDato = DateAdd("d",7,FraDato)
Loop

Dette er komplet utestet og løser ikke alle problemer, men det burde tage hånd om parameteriseringen af dine forspørgsler, samt håndtere datoer som det de er, nemlig datoer...

Hvis du arbejder med Sessions kan du, såvidt jeg husker, sætte session.LCID = 1030 for at få dansk formatering af tal og datoer (f.eks. returneret fra FormatDateTime).
Avatar billede Bjarne S. Nielsen Juniormester
05. oktober 2017 - 13:49 #19
Får denne fejl:

Der opstod en Microsoft VBScript-kompileringsfejl fejl '800a0414'

Der kan ikke bruges parenteser ved kald af en Sub

/polymeren/administrator/kalender.asp, linje 77

cmdIns.Execute(, parametre)
Avatar billede Bjarne S. Nielsen Juniormester
05. oktober 2017 - 14:14 #20
Og hvis jeg fjerner paranteserne :

ADODB.Command fejl '800a0e7c'

Parameterobjektet er forkert defineret. De angivne oplysninger er mangelfulde eller ikke ensartede.

/polymeren/administrator/kalender.asp, linje 77
Avatar billede softspot Forsker
05. oktober 2017 - 14:55 #21
Hvilke typer er StartTid og SlutTid i databasen?
Avatar billede Bjarne S. Nielsen Juniormester
06. oktober 2017 - 08:32 #22
Standard datoformat altså "dd-mm-yyyy hh:nn:ss"

Har også prøvet at formatere StartTid og SlutTid til "yyyy-mm-dd hh:nn:ss"

Med samme resultat...
Avatar billede softspot Forsker
06. oktober 2017 - 09:07 #23
Prøv at definere parameterlisten således i stedet:

        parametre = array( _
                  Serie, _
                  Request.Form("D1"), _
                  FraDato, _
                  Request.Form("D2"), _
                  Request.Form("S1"), _
                  Request.Form("D3"), _
                  Request.Form("T6"), _
                  Request.Form("T7"), _
                  Request.Form("T8"), _
                  IIF(Request.Form("C2")="ON",-1,0), _
                  DateAdd("h", CInt(Left(Request.Form("D2"),2)), FraDato), _
                  DateAdd("h", CInt(Left(Request.Form("D3"),2)), FraDato))

Her anvendes datotypen for start- og slutdato i stedet for en streng (med en halvfærdig dato/tidsangivelse).
Avatar billede Bjarne S. Nielsen Juniormester
06. oktober 2017 - 09:31 #24
Samme fejl som tidligere...:(
Avatar billede softspot Forsker
06. oktober 2017 - 09:55 #25
Prøv lige at læse den guide jeg linkede til tidligere og sæt parametrene op på command-objektet (med CreateParameter).

Skriv så igen, når dette er gjort, hvor du viser den kode du måtte have problemer med.
Avatar billede Bjarne S. Nielsen Juniormester
10. oktober 2017 - 13:43 #26
Det går hovedsageligt ud på at få værdierne i samme rækkefølge som tabelfelterne...

Men jeg får denne fejl :

Response-objekt fejl 'ASP 0106 : 80020005'

Typerne passer ikke sammen

/polymeren/administrator/kalender.asp, linje 0

Der blev fundet en datatype, der ikke kunne håndteres.
Avatar billede softspot Forsker
10. oktober 2017 - 14:19 #27
Kan du vise tabeldefinitionen for tblKalender?
Avatar billede Bjarne S. Nielsen Juniormester
12. oktober 2017 - 10:51 #28
KalenderID=Autonummerering

SerieID=Langt heltal
,Aktivitet=Langt heltal
,KalenderDato=Kort datoformat
,KalenderStart=Langt klokkeslætsformat
,KalenderBegivenhed=Lang tekst
,KalenderSlut=Langt klokkeslætsformat
,KontaktPerson=Kort tekst
,KontaktTlf=Kort tekst
,DokLink=Lang tekst
,VisesPåHjemmesiden=Ja/Nej
,StartTid=Dato og klokkeslæt (Format: yyyy-mm-dd hh:nn:ss)
,SlutTid=Dato og klokkeslæt (Format: yyyy-mm-dd hh:nn:ss)

Afsendt=Ja/Nej
Avatar billede softspot Forsker
12. oktober 2017 - 15:51 #29
Hvilke data er det, helt konkret, du sender til koden (dit form-post) når den fejler?

Specifikt er det interessant at se data i felterne, dvs. værdierne i Request.Form, der lægges i parametre-array'et.

Du kan evt. lave en løkke som udskriver alle værdierne og vise dem her. Noget i stil med dette:

for each fld in Request.Form
    Response.Write fld & " = " & Request.Form(fld) & "<br/>"
next
Avatar billede Bjarne S. Nielsen Juniormester
12. oktober 2017 - 16:59 #30
D1 = 1
T2 = 16-10-2017
D3 = 04:00:00
D2 = 02:00:00
S1 = testing
T13 = testing
C2 = ON
T10 = 06-11-2017
T11 = testing
B1 = Tilføj kalender
T7 = testing
T12 = testing
R1 = V2
Avatar billede Bjarne S. Nielsen Juniormester
17. oktober 2017 - 12:55 #31
Fik det til at køre med denne kode...
Tak for tålmodigheden...:)

        Sql="SELECT MAX(SerieID) AS Serie FROM qryKalender"
        RS.Open Sql, Conn, 3, 3
        Serie=RS("Serie")+1
            response.write Serie & "<br>"
        RS.Close
       
'--------uge tjek for optaget / ledig tid ----------
FraDato = Month(Request.Form("T2")) & "-" & Day(Request.Form("T2")) & "-" & Year(Request.Form("T2"))
TilDato = Month(Request.Form("T10")) & "-" & Day(Request.Form("T10")) & "-" & Year(Request.Form("T10"))

Do Until FraDato > TilDato
x=0
    FraTid = FraDato & " " & Left(Request.Form("D2"),2) & ":00:00"
    TilTid = TilDato & " " & Left(Request.Form("D3"),2) & ":00:00"
   
    Do Until FormatDateTime(FraTid,4) > FormatDateTime(TilTid,4)
        Sql="SELECT * FROM qryKalender WHERE Aktivitet=" & Request.Form("D1") & " AND #" & FraTid & "# BETWEEN StartTid AND SlutTid"
        RS.Open Sql, Conn, 3, 3
        If RS.EOF = False Then
            x = 1
            Optaget = Optaget & FraDato & "<br>"
            RS.Close
            Exit Do
        End If
        RS.Close
        FraTid = DateAdd("h",1,FraTid)
    Loop
   
If x = 0 Then
FraDato = Month(FraDato) & "-" & Day(FraDato) & "-" & Year(FraDato)   
    Sql="INSERT INTO tblKalender(SerieID,Aktivitet,KalenderDato,KalenderStart,KalenderBegivenhed,KalenderSlut,KontaktPerson,KontaktTlf,DokLink,VisesPåHjemmesiden,StartTid,SlutTid)" &_
    " VALUES(" & Serie & "," & Request.Form("D1") & ",'" & FraDato & "','" & Request.Form("D2") & "','" & Request.Form("S1") & "','" & Request.Form("D3") &_
    "','"  & Request.Form("T6") & "','" & Request.Form("T7") & "','" & Request.Form("T8") & "'," & IIF(Request.Form("C2")="ON",-1,0) &_
    ",'" & FraDato & " " & Request.Form("D2") & "','" & FraDato & " " & Request.Form("D3") & "');"
    response.write sql & "<br>"
    Conn.Execute(Sql)
End If
   
FraDato = DateAdd("d",7,FraDato)
FraDato = Month(FraDato) & "-" & Day(FraDato) & "-" & Year(FraDato)
Loop

If Optaget <> "" Then
    Response.Write "<font size='6'>Lokalet er optaget d. :</font><br><br><font size='5'>" & Optaget & "</font>"
    Response.Write "<a href='kalender.asp?ID=" & Serie & "&ID1=SletSerie'>Slet serie</a>"
    Response.End
End If
'--------/ uge tjek for optaget / ledig tid ----------
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

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