Avatar billede Jman Praktikant
15. juli 2003 - 09:35 Der er 17 kommentarer og
3 løsninger

Dato i BETWEEN er forkert

Hejsa ...
Jeg har en asp-side hvorfra jeg skal hente oplysninger fra en given dato + 4 dage tilbage.
Det skal lige siges at det er et kald til Oracledatabase
Mit kald ser således ud:

MaxD = CDate(Request("dato"))
MinD = MaxD - 4
strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"

Mit problem er at den henter dagen fint - altså dagen inkl. 4 dage, men måneden er helt gal - Der viser den alle måneder.

Hvad skal jeg gøre anderledes ?
Avatar billede cesil Nybegynder
15. juli 2003 - 09:37 #1
Prøv lige og udskriv strSQL
Avatar billede cesil Nybegynder
15. juli 2003 - 09:39 #2
Prøv lige og skriv
CDate(MinD)
CDate(MaxD)

istedet for CStr
Avatar billede Jman Praktikant
15. juli 2003 - 09:43 #3
Den skriver stadig ud på rigtige dage, men alle måneder tilbage
response.write er
Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%S1V%' OR upper(TEXT) LIKE '%S1V%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '07-07-2003' and '11-07-2003' order by TEXT, Timestamp
Avatar billede cesil Nybegynder
15. juli 2003 - 09:45 #4
Prøv lige

function SQLDate(dato)
dim tmpDato
    tmpDato = left(dato,10)
    SQLDate = right(tmpDato,4) & mid(tmpDato,4,2) & left(tmpDato,2)
end function

MaxD = SQLDate(Request("dato"))
MinD = dateadd("d",-4,Request("dato"))
MinD = SQLDate(MinD)

strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & minD & "' and '" & MaxD & "' order by TEXT, Timestamp"
Avatar billede cesil Nybegynder
15. juli 2003 - 09:47 #5
Jeg tror datoformattet er forkert. Det jeg prøver er at lave det om så det ser således ud yyyymmdd.
Det er sådan det skal se ud i mssql
Avatar billede nielle Nybegynder
15. juli 2003 - 09:53 #6
I MySQL er datoformatet: yyyy-mm-dd.

- så det er altså forskellig fra DB system til system. Desværre ved jeg ikke hvordan det ser ud i Oracle.
Avatar billede Jman Praktikant
15. juli 2003 - 10:00 #7
Den gik desværre ikke:
Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%S1V%' OR upper(TEXT) LIKE '%S1V%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '20030707' and '20030711' order by TEXT, Timestamp
Så får jeg ingen respons ... for i db'en står det som dd-mm-yyyy
Avatar billede cesil Nybegynder
15. juli 2003 - 10:03 #8
ja i db'en. Det er ikke ensbetydende med at det skal stå sådan i din query.

Får du en fejlmeddelelse istedet for din response?
Avatar billede cesil Nybegynder
15. juli 2003 - 10:10 #9
Du kan prøve at ændre functionen så du får samme format som MySQL vil ha det

function SQLDate(dato)
dim tmpDato
    tmpDato = left(dato,10)
    SQLDate = right(tmpDato,4) & "-" & mid(tmpDato,4,2) & "-" & left(tmpDato,2)
end function
Avatar billede Jman Praktikant
15. juli 2003 - 10:13 #10
hvorfor skal jeg egnelig ? - den første response.write er jo korrekt! Problemet er blot at der tages for mange linier fra databasen..
BETWEEN '07-07-2003' and '11-07-2003' giver stadig svar fra eks. 6, 5 og fjerde måned
Avatar billede cesil Nybegynder
15. juli 2003 - 10:20 #11
Jeg ved ikke hvordan Oracle læser datoerne. Jeg er stadig overbevist om at formattet er forkert.
Det kan også være to_char(timestamp,'DD-MM-YYYY') der har forkert format.
Avatar billede Jman Praktikant
15. juli 2003 - 10:29 #12
mit timestamp-felt siger eksempelvis:
21-01-2003 95:05:43
Avatar billede cesil Nybegynder
15. juli 2003 - 10:56 #13
Check lige det her. Det siger måske noget om hvilket format Oracle læser datoer i.
http://www.eksperten.dk/spm/303367
Avatar billede cesil Nybegynder
15. juli 2003 - 11:00 #14
Avatar billede mfla Nybegynder
15. juli 2003 - 12:42 #15
I stedet for at konvertere dit timestamp fra Oracle til en tekststreng, så gør det omvendte, og lad Oracle klare arbejdet for dig. En anden ting, så lad være med at bruge din OR betingelse, da den intet giver performancemæssigt.

Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE upper(TEXT) LIKE '%S1V%' and timestamp BETWEEN TO_DATE('07-07-2003', 'dd-mm-yyyy') and TO_DATE('11-07-2003', dd-mm-yyyy') order by TEXT, Timestamp

Du kan alternativt bruge Oracle's egen dato, så det hedder BETWEEN SYSDATE AND SYSDATE -4
Avatar billede mfla Nybegynder
15. juli 2003 - 12:44 #16
Vær dog opmærksom på, at der indgår tidspunkt i SYSDATE (prøv SELECT SYSDATE FROM DUAL for at se formatet). Du kan cast'e en variabel så mange gange du vil, så skal du kun bruge datoen kan du gøre følgende: TO_DATE(TO_CHAR(SYSDATE, 'dd-mm-yyyy'), 'dd-mm-yyyy')
Avatar billede Jman Praktikant
15. juli 2003 - 13:20 #17
OK - det fattede jeg minus af :) -- Jeg er ikke så god til dato-beregninger og slet ikke til Oracle .. ovenstående kode er faktisk genbrug/hjælp herfra ...
Kan du evt. omskrive det i den rigtige kode:
MaxD = CDate(Request("dato"))
MinD = MaxD - 4
strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis")
strSQL = strSQL & "%') and to_char(timestamp,'DD-MM-YYYY') BETWEEN '"
strSQL = strSQL & CStr(MinD) & "' and '" & CStr(MaxD) & "' order by TEXT, Timestamp"
Avatar billede Jman Praktikant
16. juli 2003 - 09:12 #18
Det er helt sikkert BETWEEN, der driller på asp-siden... Jeg har løst det således (godt nok oldnordisk, men..):

MaxD = Cdate(Request("dato"))
Min1 = MaxD -1
Min2 = Min1 -1
Min3 = Min2 -1

IF request("avis") = "alle" then
strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE TEXT LIKE '%" & "_" & "%'"
strSQL = strSQL & " and (to_char(timestamp,'dd-mm-yyyy') Like '%" & MaxD & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min1 & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min2 & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min3 & "') order by Timestamp"
Avatar billede Jman Praktikant
16. juli 2003 - 09:12 #19
tak for hjælp anyway - vi deler  :)
Avatar billede Jman Praktikant
16. juli 2003 - 09:18 #20
dingdong .. og så den rigtige kodestump, jeg baskede med :
strSQL = "Select TEXT, TIMESTAMP, EVENT, STATIONID, IDLETIME, PRODTIME FROM SIDETID WHERE (TEXT LIKE '%" & request("avis")
strSQL = strSQL & "%' OR upper(TEXT) LIKE '%" & Request("avis") & "')"
strSQL = strSQL & " and (to_char(timestamp,'dd-mm-yyyy') Like '%" & MaxD & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min1 & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min2 & "'"
strSQL = strSQL & " or to_char(timestamp,'dd-mm-yyyy') Like '%" & Min3 & "') order by Timestamp"
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