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...???
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 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...
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 Juniormester
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 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)))"
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 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...
softspot Seniormester
26. september 2017 - 14:31 #10
Prøv lige at vise den kode der ikke fungerer for dig.
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
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 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...:)
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 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...:(
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 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)
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
softspot Seniormester
05. oktober 2017 - 14:55 #21
Hvilke typer er StartTid og SlutTid i databasen?
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...
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 Juniormester
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 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.
softspot Seniormester
10. oktober 2017 - 14:19 #27
Kan du vise tabeldefinitionen for tblKalender?
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
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 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
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 ----------
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





Premium
Robotterne udfører i dag 100 mands arbejde: Lån & Spar Bank har firedoblet antallet af kundemøder ved hjælp af robotter
Fra Computerworlds arkiv: Lån & Spar Bank har kæmpesucces med robotter, der i dag udvikles af fire særlige udviklere. "De fire medarbejdere har indtil nu udviklet robotter, som udfører et arbejde det vil kræve 100 medarbejdere at udføre manuelt," siger it-direktør Casper Gjerris.
Computerworld
Ny-opdaget malware blokerer programmer som forsøger at slette den: Særligt windows 10 er ramt
En ny type malware er blevet opfanget, der både overvåger din computer og generer falske reklameindtægter til bagmændende. Og så har den en forkærlighed for Windows 10.
CIO
Henrik Jeberg om at arbejde i Silicon Valley: "Er du dygtig nok får du tilbud der får en til at falde ned af stolen."
Henrik Jeberg bor i San Francisco og er direktør i Hampleton Partners, der rådgiver om opkøb med særligt fokus på teknologi. Hør ham fortælle om forskellen på Danmark og Silicon Valley - og om nogle af de vilde forhold der hersker i verdens ubestridte tech-hovedstad.
Job & Karriere
KMD opsagde tryghedsaftaler med medarbejderne få måneder før 300 medarbejdere blev outsourcet til IBM
KMD har i løbet af foråret opsagt to såkaldte tryghedsaftaler med en del af selskabets medarbejdere. Når aftalerne stopper ved udgangen af 2018, er de pågældende medarbejdere ikke længere berettiget til særlig godtgørelse. Det kan få konsekvenser, hvis IBM som forventet skærer i antallet af de 300 KMD-medarbejdere, som selskabet overtager.
White paper
Sådan indfrier du virksomhedens digitale potentiale - og her giver det mest værdi at starte
Digitalisering er det altafgørende omdrejningspunkt for mange virksomheder. Men hvor tager man fat, så det giver mest værdi? EG har identificeret fem helt centrale områder, hvor der typisk er et perfekt match mellem virksomhedens behov og de teknologiske muligheder. Læs dette whitepaper og få indblik i, hvordan vidt forskellige virksomheder har grebet det an. 14 sider på dansk.