Avatar billede mother1978 Nybegynder
17. november 2003 - 14:03 Der 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?
Avatar billede psv Nybegynder
17. november 2003 - 14:09 #1
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"?
Avatar billede mother1978 Nybegynder
19. november 2003 - 12:51 #2
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.
Avatar billede dmk Nybegynder
19. november 2003 - 16:03 #3
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'.

/DMK
Avatar billede mother1978 Nybegynder
20. november 2003 - 09:57 #4
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.
Avatar billede mother1978 Nybegynder
20. november 2003 - 10:49 #5
Har selv fundet ud af det.....den første der svarer på :http://www.eksperten.dk/spm/430001

Får alle 130 point.

På forhånd tak!
Avatar billede dmk Nybegynder
20. november 2003 - 10:50 #6
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.
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
Computerworld tilbyder specialiserede kurser i database-management

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