Bjarne S. Nielsen Praktikant
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...???
softspot Seniormester
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.
softspot Seniormester
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))
Bjarne S. Nielsen Praktikant
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...
softspot Seniormester
25. september 2017 - 09:24 #4
Prøv evt. med:

set rs = cmd.Execute(Array(, Request.Form("D1"), CDate(FraTid)))
Bjarne S. Nielsen Praktikant
25. september 2017 - 10:40 #5
Fejl:
Objektet understøtter ikke denne egenskab eller metode: 'Connection'
softspot Seniormester
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.
Bjarne S. Nielsen Praktikant
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)))"
softspot Seniormester
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)))
Bjarne S. Nielsen Praktikant
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...
softspot Seniormester
26. september 2017 - 14:31 #10
Prøv lige at vise den kode der ikke fungerer for dig.
Bjarne S. Nielsen Praktikant
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
softspot Seniormester
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...
softspot Seniormester
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?
softspot Seniormester
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.
Bjarne S. Nielsen Praktikant
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...:)
softspot Seniormester
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
Bjarne S. Nielsen Praktikant
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...:(
softspot Seniormester
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).
Bjarne S. Nielsen Praktikant
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)
Bjarne S. Nielsen Praktikant
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
softspot Seniormester
05. oktober 2017 - 14:55 #21
Hvilke typer er StartTid og SlutTid i databasen?
Bjarne S. Nielsen Praktikant
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...
softspot Seniormester
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).
Bjarne S. Nielsen Praktikant
06. oktober 2017 - 09:31 #24
Samme fejl som tidligere...:(
softspot Seniormester
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.
Bjarne S. Nielsen Praktikant
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.
softspot Seniormester
10. oktober 2017 - 14:19 #27
Kan du vise tabeldefinitionen for tblKalender?
Bjarne S. Nielsen Praktikant
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
softspot Seniormester
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
Bjarne S. Nielsen Praktikant
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
Bjarne S. Nielsen Praktikant
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 ----------
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

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





Computerworld
Nu sender dansk advokatfirma opkrævninger til tusindvis af pirat-mistænke internetbrugere
Et danske firma sender i øjeblikket opkrævninger på op til 4500 kroner ud til tusindvis af svenskere, der mistænkes for at være pirater.
CIO
"På 11 minutter blev vores computere ramt af den frygtede Petya ransomware-skærm"
"På 11 minutter blev vores computere ramt af den frygtede Petya ransomware-skærm. Først troede vi, at det bare ville blive en aften uden email, og at de ville fikse det i løbet af natten. Men næste morgen var der krisemøde, og vi fik at vide, at vi ville være nede i lang tid."
Comon
Anmeldelse: Livet som superhelt i Midgård er stadig fornøjeligt
Shadow of War bygger videre på alle de solide kvaliteter fra forgængeren, og lader dig agere action-stjerne i Tolkiens univers.
Job & Karriere
IBM’s Watson har gennemlæst 600 jobopslag, og snart kan der blive vendt op og ned på vores jobsøgning
Kunstig intelligens kan forandre den måde virksomheder rekrutterer på. Derfor har IBM netop gennemført et stort forsøg med Danmarks største erhvervsskole.
White paper
Sådan anvender du Microsofts Assessment og Planning Toolkit i dit it-miljø
Dette whitepaper gennemgår hvordan du anvender du Microsofts Assessment og Planning Toolkit i dit it-miljø og kommer med specifikke råd og konkret vejledning til anvendelsen.