Ricerca di una data in un campo varchar2

giovedì 02 agosto 2007 - 10.14

elsinore Profilo | Junior Member

Ciao a tutti,
io ho questa necessità, di ricercare degli item in un range di date, tali date però sono scritte in un cmapo vachar2, vi chiedo un consgilio perchè ho dei comportamenti strani, cioè, la query che eseguo, che mi ritorna un elemento, è questa

select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and ORA between '02/08/2005' and '3/08/2007' AND FLUSSO = 'G' order by ORA DESC

mentre se scrivo

select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and ORA between '02/08/2005' and '03/08/2007' AND FLUSSO = 'G' order by ORA DESC

cioè mettendo 03 invece di 3...non mi ritorna niente.... per info, la data che mi ritorna è 11/08/2007....quindi è sballata pure quella..... ...c'è un modo, via query, per trattare come data ciò che pesco da un campo non data?

grazie!

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>io ho questa necessità, di ricercare degli item in un range di
>date, tali date però sono scritte in un cmapo vachar2, vi chiedo
>un consgilio perchè ho dei comportamenti strani, cioè, la query
>che eseguo, che mi ritorna un elemento, è questa
>
>select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and
>ORA between '02/08/2005' and '3/08/2007' AND FLUSSO = 'G' order
>by ORA DESC
>
>mentre se scrivo
>
>select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and
>ORA between '02/08/2005' and '03/08/2007' AND FLUSSO = 'G' order
>by ORA DESC
>
>cioè mettendo 03 invece di 3...non mi ritorna niente.... per
>info, la data che mi ritorna è 11/08/2007....quindi è sballata
>pure quella..... ...
Questo è del tutto normale.. se utilizzi il between la ricerca viene effettuata su un range. E siccome si parla di stringhe il loro ordinamento è del tutto indipendente dalla data che è scritta al loro interno. Questo significa che "11/08/2007" è minore di "3/08/2007" poichè il 3, come stringa è maggiore dell'1 della prima sequenza di caratteri.
Quindi non aspettarti risultati esatti se salvi le date come stringhe. L'unico modo per cui una ricerca del genere può avere risultati più consoni è l'utilizzo del formato ISO SSAAMMGG..
Ma sinceramente mi sento di dirti che se il campo deve contenere una data, il tipo di dato del campo deve essere DATETIME. O chi per lui se usi DBMS diversi da SQL Server. E allora anche la between funzionerà correttamente.

>c'è un modo, via query, per trattare
>come data ciò che pesco da un campo non data?
se possibile cambiare tipo dato.
>
>grazie!
di nulla!
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino

elsinore Profilo | Junior Member

ti chiedo un'altra cosa...

in oracle, se il campo è di tipo data, me lo scrive per esmpio così.... 15-Gen-1977...... è possibile fare in modo che me lo scriva così 15/01/1977?

No perchè il problema che ho ora è che le date sono scritte tutte tipo 15/01/1977.....e se converto il campo e ci riscrivo la data così mi dice che il mese non è valido.....

elsinore Profilo | Junior Member

alla fine ho risolto così....

il campo rimane di tipo stringa....se no mi si incasina tutta l'applicazione.... e la query l'ho fatta così

select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and (to_date(ORA,'DD/MM/YYYY hh24:mi:ss')) between (to_date('02/08/2005','DD/MM/YYYY hh24:mi:ss')) and (to_date('03/08/2008','DD/MM/YYYY hh24:mi:ss')) AND FLUSSO = 'C' order by ORA DESC

alx_81 Profilo | Guru

>alla fine ho risolto così....
>
>il campo rimane di tipo stringa....se no mi si incasina tutta
>l'applicazione.... e la query l'ho fatta così
>
>select * from HR.LOG where SOURCE = 'EDMS' and STATO ='OK' and
>(to_date(ORA,'DD/MM/YYYY hh24:mi:ss')) between (to_date('02/08/2005','DD/MM/YYYY
>hh24:mi:ss')) and (to_date('03/08/2008','DD/MM/YYYY hh24:mi:ss'))
>AND FLUSSO = 'C' order by ORA DESC
>
purtroppo non conosco oracle..
quindi non so darti delucidazioni..
ma l'approccio che hai avuto continua a non essere quello giusto, a mio avviso.
Proviamo ad aspettare un parere da chi oracle lo usa già da un po'..
Secondo me dovresti cercare di utilizzare il corretto datatype..
Per la conversione, dovresti ricaricarle nel formato ISO che ti dicevo prima..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

elsinore Profilo | Junior Member

guarda il problema non è che non voglio usare il campo di tipo data.....è che non posso..... fosse per me l'avrei già cambiato...sono d'accordo con te che è sbagliato fare così......
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5