Operatore Between tra due date.

lunedì 23 luglio 2012 - 12.29

Geronimo79 Profilo | Junior Member

Salve a tutti gli amici di Dotnethell, uso Sql Server Express 2008 e asp.net 4.0 ed ho un problema con l'operatore between di Sql. Popolo un datagrid in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


In pratica mi si presenta questo problema che riassumo schematicamente:

Se ho un record che contiene:
"CODFISC=xxxxxxx" / "DAL = 01.01.2010" / "AL = 31.12.2010 " / "TIPO = ABCDE" / "N° Giorni = 365"

se volessi effettuare una ricerca di questo tipo DAL = 01.01.2010 / AL 06.09.2010 mi viene restituito il record corretto, se invece volessi fare DAL = 03.07.2010 / AL 06.09.2010 non mi viene restituito! Qualcuno può aiutarmi?
Grazie a tutti.
Un saluto.

nico839 Profilo | Senior Member

ciao, se ho capito bene e la troppa fame(vista l'ora) non mi sta annebbiando il cervello, tu stai cercando un evento che abbia sia la data inizio che la data finale compresa in un intervallo di date, e non un evento che si stia verificando in un intervallo di date....teoricamente non dovrebbe farti vedere neanche la prima ricerca...
Ciao.
Nicolas

http://perledinico.blogspot.com

dinoxet Profilo | Senior Member



>"CODFISC=xxxxxxx" / "DAL = 01.01.2010" / "AL = 31.12.2010 " / "TIPO = ABCDE" / "N° Giorni = 365"

>se volessi effettuare una ricerca di questo tipo DAL = 01.01.2010 / AL 06.09.2010 mi viene restituito il record corretto,
>se invece volessi fare DAL = 03.07.2010 / AL 06.09.2010 non mi viene restituito! Qualcuno può aiutarmi?
select * from tabella where dal beetwen 03.07.2010 and 06.09.2010 end and al beetwen 03.07.2010 and 06.09.2010 end
>Grazie a tutti.
prego
>Un saluto
ciao
DINOXET
__________________________________________
impossible is only a word

lbenaglia Profilo | Guru

>se volessi effettuare una ricerca di questo tipo DAL = 01.01.2010
>/ AL 06.09.2010 mi viene restituito il record corretto, se invece
>volessi fare DAL = 03.07.2010 / AL 06.09.2010 non mi viene restituito!
>Qualcuno può aiutarmi?

Il problema è dovuto al fatto che stai componendo dinamicamente il comando di SELECT (cosa pericolosissima per via di possibili attacchi di SQL injection) senza rispettare il formato ANSI SQL per le date ('yyyymmdd').
In merito al primo problema, dai una lettura al seguente articolo di Erland:
http://www.sommarskog.se/dynamic_sql.html

>Grazie a tutti.
Prego.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Geronimo79 Profilo | Junior Member

Allora se eseguo una ricerca 01.01.2010 in poi mi restituisce il record giusto perchè è l'inizio del periodo e viene riconosciuto...se già la ricerca parte dal 02.01.2010 allora niente...potete farmi qualche esempio per cercare di risolvere il problema??
Grazie comunque per i suggerimenti.

nico839 Profilo | Senior Member

dovresti cercare il record tale per cui la data inizio del periodo sia compresa tra "dal" e "al" e data fine periodo compresa tra "dal" e "al", cioè

"select * from tab1 where " & _
"( " & textbox9.text & " between dal and al ) and (" & textbox10.text & " between dal and al)"
naturalmente con textbox9.text e textbo10.text intendo la loro conversione in formato data

Ciao.
Nicolas

http://perledinico.blogspot.com

lbenaglia Profilo | Guru

>Allora se eseguo una ricerca 01.01.2010 in poi mi restituisce
>il record giusto perchè è l'inizio del periodo e viene riconosciuto...se
>già la ricerca parte dal 02.01.2010 allora niente...potete farmi
>qualche esempio per cercare di risolvere il problema??
Probabilmente la lingua di default associata alla tua login è l'inglese, pertanto 01.01.2010 è sempre interpretato correttamente come 1 gennaio, mentre 02.01.2010 come 1 febbraio, quindi ti sballa il risultato.
Come ho scritto il problema lo puoi risolvere formattando le date come 'yyyymmdd', ovvero '20100101' e '20100102' senza alcun separatore. Tieni presente che permane il pericolo di SQL Injection, risolvibile ad esempio con una banale stored procedure parametrica.

>Grazie comunque per i suggerimenti.
Prego.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Geronimo79 Profilo | Junior Member

Niente non và nemmeno cambiando formato....ho provato anche la soluzione di Nico e mi restituisce "Conflitto del tipo di operando:date è incompatibile con int" il textbox è formattato con maskededit di ajax come data...Non sò dove sbaglio

nico839 Profilo | Senior Member

hai convertito textbox.text in data con Convert?
http://msdn.microsoft.com/en-us/library/ms187928.aspx

Ciao.
Nicolas

http://perledinico.blogspot.com

lbenaglia Profilo | Guru

>Niente non và nemmeno cambiando formato....ho provato anche la
>soluzione di Nico e mi restituisce "Conflitto del tipo di operando:date
>è incompatibile con int" il textbox è formattato con maskededit
>di ajax come data...Non sò dove sbaglio
Posta la stringa SQL risultato delle varie concatenazioni...

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

lbenaglia Profilo | Guru

>hai convertito textbox.text in data con Convert?
>http://msdn.microsoft.com/en-us/library/ms187928.aspx

Ciao Nicolas,

Sta componendo una stringa pertanto non deve eseguire alcun cast a datetime.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

nico839 Profilo | Senior Member

@lbenaglia infatti io intendevo nella stringa di inserire il convert, tipo
"select * bla bla where Convert(Date, '" & textbox.text & "' , 103)" in modo da dare in pasto a sql un valore data.
Ma se il mio ragionamento è errato chiedo scusa e se mi spiagassi il perchè mi farebbe molto piacere...
Ciao.
Nicolas

http://perledinico.blogspot.com

lbenaglia Profilo | Guru

>@lbenaglia infatti io intendevo nella stringa di inserire il
>convert, tipo
>"select * bla bla where Convert(Date, '" & textbox.text & "'
>, 103)" in modo da dare in pasto a sql un valore data.
>Ma se il mio ragionamento è errato chiedo scusa e se mi spiagassi
>il perchè mi farebbe molto piacere...

Ciao Nicolas,

Io eseguirei il cast direttamente in .Net producendo una stringa nel formato 'YYYYMMDD'. Ancora meglio, scriverei una sp parametrica in modo da mettermi al riparo da ogni tipo di attacco di SQL Injection.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Geronimo79 Profilo | Junior Member

Questa è la stringa base a cui aggiungere la query…

"SELECT Codfisc, Dal, Al, Tipo, DATEDIFF(day, Dal, Al) + 1 AS 'N° Giorni' FROM Tab1 where codfisc = '" & HiddenField1.Value & "'……

Ho provato così:

"SELECT Codfisc, Dal, Al, Tipo, DATEDIFF(day, Dal, Al) + 1 AS 'N° Giorni' FROM Modelloe where codfisc = '" & HiddenField1.Value & "' and " & textbox9.text & " between dal and al ) and (" & textbox10.text & " between dal and al)"

Mi restituisce l'errore descritto sopra...
Grazie.

nico839 Profilo | Senior Member

effettivamente la sp oltre alla sicurezza è anche migliori in termini di prestazioni, quindi è meglio fare il cast in .net piuttosto che in sql a livello sia di performance che di errori?
nella query sembra manchi un'apertura di parentesi prima di & textbox9.text
Ciao.
Nicolas

http://perledinico.blogspot.com

Geronimo79 Profilo | Junior Member

Si hai ragione...ma è solo un errore di battitura...

Piccola osservazione: i campi "Dal" "Al" in questione sono di tipo "Date" e non "Datetime"....

Geronimo79 Profilo | Junior Member

Ho risolto così inserendo l'operatore OR:

("SELECT Codfisc, Dal, Al, Tipo, DATEDIFF(day, Dal, Al) + 1 AS 'N° Giorni' FROM Tab1 where codfisc = '" & HiddenField1.Value & "' and Dal between '" & TextBox9.Text & "' and '" & TextBox10.Text & "' or Al between '" & TextBox9.Text & "' and '" & TextBox10.Text & "' Order by Dal", MyConnection)

Grazie come sempre per l'aiuto ed i buon consigli..:-)
Un saluto.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5