Errore query select su datetime

martedì 24 giugno 2008 - 15.23

Maurizio_Roma Profilo | Newbie

Salve a tutti, ho un problema con una select.
devo avere in risposta dalla query, il contenuto di una colonna compreso in un range di tempo.

la query che utilizzo è questa

SELECT Process_Value FROM Batch_Proc WHERE Time_Stamp BETWEEN '" & TimeStart & '" AND '" & TimeFine & "'"

La tabella da selezionare è di tipo Varchar(255) mentre la tabella Time_Stamp è di tipo datetime. Il Database è MS SQL SERVER 2005 Standard Edition

Il messaggio di errore che viene visualizzato quando eseguo la query è questo:

[Microsoft][ODBC SQL Server Driver][SQL SERVER] the conversion of a char data type to a datetime data type resulted in an out-of-range datetime value

Sapete come posso eseguire questa query?

Grazie come sempre dell'aiuto

alx_81 Profilo | Guru

>Salve a tutti,
Ciao!

>la query che utilizzo è questa
>SELECT Process_Value FROM Batch_Proc WHERE Time_Stamp BETWEEN
>'" & TimeStart & '" AND '" & TimeFine & "'"
Non finirò mai di dire che NON SI DEVONO CONCATENARE LE STRINGHE sulle query che si passano al DB. Sono causa degli attacchi "facili" dei malintenzionati, che con il SQL Injection possono avere facilmente accesso alle informazioni del database.
Quindi, ti consiglio in primis di usare le query parametriche (quelle con @parametro), evitando in ogni modo le concatenazioni.

>
>La tabella da selezionare è di tipo Varchar(255) mentre la tabella Time_Stamp è di tipo datetime.
Cosa vuol dire che la tabella è di tipo varchar(255)? Una tabella non è di nessun tipo, se non Tabella . Quelle che indichi tu sono colonne .
>
>[Microsoft][ODBC SQL Server Driver][SQL SERVER] the conversion
>of a char data type to a datetime data type resulted in an out-of-range
>datetime value
Non utilizzare ODBC con SQL Server, ti consiglio il System.Data.SqlClient, che è più vantaggioso e performante.
>
>Sapete come posso eseguire questa query?
Il fatto è che stai concatenando date come se fossero stringhe. Se vuoi utilizzare un formato valido per la tua ricerca, devi applicare il formato ISO:
'YYYYMMDD HH:mm:ss.nnn'.

>Grazie come sempre dell'aiuto
Di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Maurizio_Roma Profilo | Newbie

Per gli attacchi non ci sono problemi, tanto sql è collegato solo ad un pc che non ha nessun accesso ad internet, per quanto riguarda l'odbc lo devo usare in quanto il codice è sviluppato in vba, e quindi devo appoggiarmi all'adodb.
Per quanto riguarda la query, utilizzo il concatenamento perchè il risultato delle variabili TimeStart e TimeFine lo ottengo dall'esecuzione di altre query su altre tabelle.

Come posso evitare questo errore?

Grazie

Brainkiller Profilo | Guru

Ciao Maurizio,
io ti rispondo su questa parte.

>Per gli attacchi non ci sono problemi, tanto sql è collegato
>solo ad un pc che non ha nessun accesso ad internet, per quanto

Beh non è vero che non ci sono problemi, spesso molti attacchi arrivano dall'interno e non dall'esterno. Quindi se trovi uno stronzetto come me che ti droppa una tabella, che figura ci fai ? (sempre se sei tu quello che ha sviluppato l'applicazione).

E seconda cosa, che motivo ci sarebbe per scrivere una applicazione "male" anche se è ad uso interno ?

Sul resto ti risponde Ale.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

alx_81 Profilo | Guru

>Per gli attacchi non ci sono problemi, tanto sql è collegato
>solo ad un pc che non ha nessun accesso ad internet,
Bugia. E David ha puntualizzato. Mai sottovalutare il problema dall'interno.

>per quanto riguarda l'odbc lo devo usare in quanto il codice è sviluppato
>in vba, e quindi devo appoggiarmi all'adodb.
Adodb può anche usare OLEDB, basta installare la versione corretta di MDAC e cambiare la connectionstring.

>Per quanto riguarda la query, utilizzo il concatenamento perchè il risultato delle variabili TimeStart e TimeFine lo ottengo
>dall'esecuzione di altre query su altre tabelle.
Ok, ma non sei costretto ad usare la concatenazione. Piuttosto crea delle stored procedure alle quali passerai i parametri, ed eviti la worst practices della concatenazione. Utilizza due parametri di tipo datetime, tipizzali e passali con la collection dei parameters dell'oggetto Command.
Così come potevi fare anche in VB6 e ASP.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Maurizio_Roma Profilo | Newbie

Ciao Brainkiller, sono perfettamente d'accordo con te del fatto che non c'è nessun motivo per fare un'applicazione male, ma purtroppo è il tempo che ci manca.
Tutto questo serve per creare un report di una produzione, e il tempo per realizzarlo è molto ma molto ma molto breve, quindi per il momento siamo costretti a farlo così, anche se male, poi con calma una volta approvato il report, potremmo rimettere mano e megliorare il tutto, ma ora abbiamo l'urgenza di farlo.

Ciao

Maurizio_Roma Profilo | Newbie

Putroppo per voi avete a che fare con "tonto" dell'sql, sono stato buttato a fare questo senza sapere quello che faccio, quindi per me stored procedure e compagnia è una lingua incomprensibile.
Vi chiedo aiuto proprio perchè non ho tempo per leggere manuali, altrimenti avrei trovato una soluzione di certo migliore, ma putroppo non posso.

alx_81 Profilo | Guru

>Putroppo per voi avete a che fare con "tonto" dell'sql, sono
>stato buttato a fare questo senza sapere quello che faccio, quindi
>per me stored procedure e compagnia è una lingua incomprensibile.
>Vi chiedo aiuto proprio perchè non ho tempo per leggere manuali,
>altrimenti avrei trovato una soluzione di certo migliore, ma
>putroppo non posso.
Il VBA è .Net oppure è VBA "vecchio stile"? Quindi è Visual Basic o è già .NET?
perchè nel secondo caso posso farti una demo di una chiamata in VB.Net evitando ADODB.
Nel secondo il codice è VB6 e dovrei scriverlo a memoria.. ma non ho molta dimestichezza..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

freeteo Profilo | Guru

ciao,
concordo assolutamente con Alex e Brainkiller, la sicurezza deve essere tenuta in considerazione sempre, anche perchè poi diventa un tuo "modus operandi" e non solo una questione di sicurezza, se lo prendi come approccio di non interessartene poi ci puoi "cascare" anche in futuro su cose ancora più gravi.

Perciò il codice classico da usare è questo, praticamente lo dovresti usare quasi sempre, apri la connessione, carichi i dati e li chiudi, e la query E' FATTA CON I PARAMETRI per evitare tutti i problemi di sicurezza e di formati vari.

Ecco un esempio, da adattare ovviamente alla tua situazione :
using (OdbcConnection conn = new OdbcConnection("...")) { OdbcCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT ... FROM ... WHERE data BETWEEN ? AND ?"; //--- parametri cmd.Parameters.Add(new OdbcParameter("dataStart", DateTime.Now.AddDays(-20))); cmd.Parameters.Add(new OdbcParameter("dataEnd", DateTime.Now)); conn.Open(); OdbcDataReader reader = cmd.ExecuteReader(); ... fai quello che devi fare... ... e se ti serve puoi caricare una datatable DataTable table = new DataTable(); table.Load(reader); }

* traduci in vb.net se ti serve magari con un traduttore automatico come: http://www.carlosag.net/Tools/CodeTranslator/


Però ribadisco il fatto che ok che hai poco tempo (e chi ne ha mai avuto tanto?) ma è anche vero che usare un parametro al posto di una concatenazione di stringhe penso che il tempo impiegato sia praticamente nullo
Mi sembra più una pigrizia.

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

Maurizio_Roma Profilo | Newbie

Ragazzi grazie dell'aiuto ma forse mi sono spiegato male io.
Tutto questo è nato dalla necessità di esegurie un report. Un programma inserisce in automatico nelle tabelle di sql i parametri derivanti da un esecuzione di un Batch di produzione, come ad esempio la data di creazione, la data di avvio, di fine, il nome e così via, tutti parametri che dovrò inserire nel report.
Il punto è che io devo esegure una serie di query per poi immagazzinare i risulati in variabili che mi serviranno per generare il foglio excel.
Passo come parametro del between TimeStart e TimeFine, perchè sono variabili che contengono la query precedente che è appunto quella che mi da l'ora d'inizio e l'ora di fine del batch. Con questo range io devo ottenere, prima di tutto, tutti i valori di processo, poi gli equipment utilizzati, ed infine tutti gli allarmi intervenuti classificandoli per categoria.
Il mio problema sta nel fatto che cercando di fare la query tra un tipo di colonna varchar e uno datetime, mi da quell'errore.
Il formato della data è il seguente:"24/06/2008 13.13.13" e vi ricordo che il formato della colonna è datetime
So che per voi è più importante la sicurezza, e vi do pienamente ragione, ma non lo è in questo momento per noi (siamo in 3 in questo progetto), la cosa che è più importante per noi, è completare questo Batch Report.
Una volta approvato, rivedremo tutto, questo è garantito, ma per ora dobbiamo avere in mano un file excel completo.

Grazie

lbenaglia Profilo | Guru

>Il formato della data è il seguente:"24/06/2008 13.13.13" e vi
>ricordo che il formato della colonna è datetime

E qui sta il problema.
L'unico formato stringa indipendente dai formati internazionali di Data e Ora è quello ANSI SQL, ovvero 'YYYYMMDD hh:mm:ss.ms' senza alcun separatore per la data.
Tibor ha scritto un trattato sull'argomento:
http://www.karaszi.com/SQLServer/info_datetime.asp

Sul SQL Injection, Erland ha scritto "la bibbia":
http://www.sommarskog.se/dynamic_sql.html

>So che per voi è più importante la sicurezza, e vi do pienamente
>ragione, ma non lo è in questo momento per noi (siamo in 3 in
>questo progetto), la cosa che è più importante per noi, è completare
>questo Batch Report.
Spesso utilizzando gli strumenti e le tecniche corrette, si spende 1 minuto di più sui libri per risparmiare ore, giorni o mesi nell'implementazione

>Una volta approvato, rivedremo tutto, questo è garantito, ma
>per ora dobbiamo avere in mano un file excel completo.
Perdonami, ma per esperienza faccio fatica a crederci
Nella mia vita lavorativa ho perso il conto dei prototipi che sono entrati in produzione

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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