17. november 2003 - 14:03Der er
5 kommentarer og 1 løsning
Problemer med dato i ORACLE
Jeg har følgende query: SELECT COUNT(call_id) FROM edge.t_exp_an2_kont_data WHERE (TO_DATE(calldate,'dd-mm-rrrr') >= TO_DATE('12-08- 2003','dd-mm-rrrr')) AND (TO_DATE(calldate,'dd-mm-rrrr') <= TO_DATE('14-08- 2003','dd-mm-rrrr'))
Når jeg laver queryen med VB script får jeg resultatet 0. Indsætter jeg SQL-sætningen i min query analyzer(TOAD) får jeg 466.
Vælger jeg en anden tabel er resultatet det samme. Er der nogen der en god metode til at debugge noget som dette?
Så vidt jeg kan se benytter du dig af en VB-funktion "calldate" som TOAD - eller Oracle for de sags skyld - ikke kender. Men hvorfor ikke bare erstatte hele "to_date(calldate, '...')" af "sysdate"?
calldate er et felt i ORACLE. TO_DATE er en funktion i SQL. Mit problem er at jeg overhovedet ikke får eksekveret QUERY´en når jeg har min dato evaluering med. Laver jeg en response.write på min sql-streng og indsætter denne i min QUERY analyzer kører det fint og jeg får et resultat jeg kan bruge til noget. Fjerner jeg min evaluering med dato i min SQL-streng virker det igen på min asp.side. Jeg har nu fundet ud af at jeg får sendt strengen afsted uden fejl men resultatet får jeg IKKE opdateret i min variabel. Det samme igen, fjerner jeg min evaluering med dato, får jeg opdateret min variabel. Det mystiske er jo at udskriver jeg strengen med dato evalueringen og indsætter denne i min query-analyzer, virker det fint, men gør jeg det med VB script sker der nada. MEGET MEGET mystisk.
Bare lige for at være helt sikker: De mellemrum du har imellem måned og år, er forhåbentlig ikke med i din rigtige streng? Jeg kender ikke lige formatstrengen 'rrrr'. 'rr' betyder "rund til området omkring 1950-2049", så 49 bliver 2049, men 50 blive 1950. Men når du har 4 r'er i din formatstreng, er jeg ikke sikker på Oracle forstår hvad det er du vil. Prøv med 'yyyy'.
Til dmk: Jamen....anvender jeg rrrr når jeg indsættter i query-analyzeren går det jo fint!
Til Alle:
Nej....mellemrummene er ikke med. jeg prøver lige at vedlægge koden jeg anvender. SELECT COUNT(s.call_id) FROM edge.t_exp_an2_status s, edge.t_exp_an2_kont_data k WHERE s.call_id = k.call_id AND k.korrektur IS NULL AND TO_DATE(s.END_,'DD-MM-YYYY') < TO_DATE(sysdate,'DD-MM-YYYY')
Response.Write sql On Error Resume Next set rs = cn.Execute(sql) If Err Then ADOErr(sql) Else antal_ejkorr = rs.Fields("COUNT(S.CALL_ID)").Value rs.Close End If
Dette er koden der anvendes. ADOErr er bare en funktion til at håndtere fejl. Når jeg udfører dette får jeg intet i antal_ejkorr(den er simpelthen NULL). Tager jeg derimod og copy paster min sql sætning ind i min query analyzer får jeg tallet 14969. Anvender jeg så følgende SQL-sætning:
SELECT COUNT(s.call_id) FROM edge.t_exp_an2_status s, edge.t_exp_an2_kont_data k WHERE s.call_id = k.call_id AND k.korrektur IS NULL
d.v.s uden dato evalueringen får jeg tallet 149674 altså fem højere.
Det mystiske er så at sidste SQL sætning går altid godt, hvorimod første går godt begge gange i query-analyzeren, men i min webapplikation får jeg intet resultat i antal_ejkorr når jeg har dato-klausulen med. Jeg får heller ingen fejl da ADOErr ikke bliver udørt.........jeg er totalt presset.
Hvilken type er s.END_ feltet? Hvis det er en date, skal du ikke lave en TO_DATE funktion på det. TO_DATE tager en streng og konverterer den til en date ud fra en given formatstreng. Jeg ved ikke hvordan Oracle reagerer når du giver den en date hvor den forventer en varchar. Men prøv at lade være med det!
SELECT COUNT(s.call_id) FROM edge.t_exp_an2_status s, edge.t_exp_an2_kont_data k WHERE s.call_id = k.call_id AND k.korrektur IS NULL AND s.END_< sysdate
Det samme gælder den første SQL du gav:
SELECT COUNT(call_id) FROM edge.t_exp_an2_kont_data WHERE calldate>= TO_DATE('12-08-2003','dd-mm-yyyy') AND calldate<=TO_DATE('14-08-2003','dd-mm-yyyy')
Prøv det. Ellers kan jeg ikke se hvad der skulle være galt.
Synes godt om
Ny brugerNybegynder
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.