Ricerca per data

venerdì 23 giugno 2006 - 12.18

bluland Profilo | Guru

Salve ho una listbox riempita con delle date prese da una tabella nel seguente formato: 2006-06-23 11:12:47 AM

vorrei effettuare la ricerca di record tramite data ho usato questo codice:

Dim queryDatadett As String = "select distinct * from Ord_Web where Data_Creazione = @elemento"

Me.ConnOrd.Open()


Dim cmd As New SqlCommand(queryDatadett, Me.ConnOrd)
cmd.Parameters.Add("@elemento", Me.LstDate.SelectedItem.Value)

Dim read As SqlDataReader

read = cmd.ExecuteReader(CommandBehavior.CloseConnection)

Me.DgItem.DataSource = read
Me.DgItem.DataBind()
Me.DgItem.Visible = True
Me.Lblitem.Visible = True

solo che non mi appare nessun datagrid, ci sono problemi di ricerca se inserisco le date? qualcuno sa dirmi qualcosa a proposito?

saluti Enzo

alx_81 Profilo | Guru

ciao
tre cose:

1) controlla che il tipo di dato del campo Data_Creazione sulla tabella Ord_Web sia datetime?

2) specifica il tipo nella dichiarazione del parametro:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

3) Occhio all'operatore di uguaglianza nella query, pretende che siano uguali anche l'ora, i minuti, i secondi.. al massimo ti conviene eseguire il controllo di uguaglianza solo su una parte della data, yyyy-mm-dd solamente, per intenderci:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

penso di aver capito il problema ma ancora devo capire come risolverlo, poiche in ingresso alla query arriva l'orario senza i millisecondi, anzi per essere precisi viene messo di default come millisecondi '.000', invece nel db Sql poiche ho usato la funzione getdate() esse sono memorizzate nel formato che ti ho scritto con i millisecondi quindi, ora io ho pensato di usare nella query una between e di mettere un range di millisecondi in questo modo:

select * from Ord_web where Data_creazione between '6/22/2006 2:24:23 ' + '.000' and '6/22/2006 2:24:23 ' + '.999'

e cosi la query mi funziona , ma appena la scrivo cosi:

select * from Ord_web where Data_creazione between @elemento + '.000' and @elemento + '.999'

non funziona ed ho capito anche il perche' , cioe' @elemento= listdata.selecteditem.value che mi da questo formato :

6/22/2006 1:46:10 PM quindi anche se nella query aggiungessi + '.000' mi da un errore poiche avrei una stringa del tipo : 6/22/2006 1:46:10 PM.000 invece che 6/22/2006 2:24:23 .000

idee?

alx_81 Profilo | Guru

te l'ho già scritto

ricava le parti di data pezzo per pezzo e componi tu la stringa come meglio credi.. lo stesso fai di elemento..

usa le varie year() monnth(), day() o la DATEPART per ricavare la parte che ti interessa.. in modo che vai a gestire solo fino ai secondi..
ti allego un esempio:

SELECT * FROM TABELLA WHERE ( CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-' + RIGHT('00' + CAST(MONTH(GETDATE()) AS VARCHAR(2)),2) + '-' + RIGHT('00' + CAST(DAY(GETDATE()) AS VARCHAR(2)),2) + ' ' + CAST(DATEPART(hour,GETDATE()) AS VARCHAR(2)) + ':' + CAST(DATEPART(minute,GETDATE()) AS VARCHAR(2)) + ':' + CAST(DATEPART(second,GETDATE()) AS VARCHAR(2)) ) = ( CAST(YEAR(@elemento) AS VARCHAR(4)) + '-' + RIGHT('00' + CAST(MONTH(@elemento) AS VARCHAR(2)),2) + '-' + RIGHT('00' + CAST(DAY(@elemento) AS VARCHAR(2)),2) + ' ' + CAST(DATEPART(hour,@elemento) AS VARCHAR(2)) + ':' + CAST(DATEPART(minute,@elemento) AS VARCHAR(2)) + ':' + CAST(DATEPART(second,@elemento) AS VARCHAR(2)) )
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

ho fatto cosi e mi sono ricavato la data e questo è un passo il problema che sorge ora è un altro, cioè, ............

Db Sql server ha un piccolo inconveniente (mio parere), se provo a fare una query tipo

select * from ord_web where data_creazione = '20/06/2006'

non mi ritorna niente, anche se il campo è pieno, allora ho pensato di provare con
select * from ord_web where data_creazione between '20/06/2006' and '20/06/2006'

ancora non ritorna niente

invece se faccio
select * from ord_web where data_creazione between '20/06/2006' and '21/06/2006'

mi ritorna tutti i record del 20/06/2006 quindi, a ricavare la data 20/06/2006 ho fatto come hai detto tu e con lo stesso metodo ho aggiunto +1 al giorno e mi sono ricavato anche il secondo membro e TUTTO FUNZIONA!!!
il problema e che se mi trovo in una data tipo 30/06/2006 e faccio +1
mi troverei una query del tipo
select * from ord_web where data_creazione between '30/06/2006' and '31/06/2006'
ed ovviamente qui mi da errore poiche' il 31 non esiste e cosi anche per il resto di tutti i fine mese, che ne dici qualche idea?? grazie ancora..


alx_81 Profilo | Guru

Dunque..
vediamo di mettere a posto alcune cose..

Se tu usi l'uguaglianza, l'unico modo è far combaciare il parametro con la data, ed un esempio è quello che ti ho passato io..
però, con gli operatori <, <=, >, >= e Between è chiaro che puoi fare la ricerca sull'intervallo e quindi il risultato ti torna per forza..
Non è per nulla un problema di sql server, è la realtà, perchè se hai una data 2006-06-23 1:14:30.876 ad esempio, un valore 2003-06-23 non è uguale, perchè nel datetime, un valore come quest'ultimo è implicitamente convertito in 2003-06-23 00:00:00.000, insomma a mezzanotte.. quindi i due valori non saranno mai '='.. capito? se tu non indichi le ore, i minuti e i secondi (se vuoi anche i millisecondi) non è per nulla uguale, ma a parità di anno/mese/giorno sempre inferiore, perchè parte dalla mezzanotte.

Di conseguenza, puoi fare la between tra un giorno e il successivo, ma devi essere sicuro che non ti serva un solo record, perchè, non sapendo la tua situazione reale, potrebbero esserci tanti record tra un giorno e l'altro..

Comunque sia non devi fare + 1, devi lavorare sulle ore, i minuti e i secondi con i limiti minimi e massimi, così

SELECT * FROM TABELLA WHERE @elemento Berween ( CAST(YEAR(Data1) AS VARCHAR(4)) + '-' + RIGHT('00' + CAST(MONTH(Data1) AS VARCHAR(2)),2) + '-' + RIGHT('00' + CAST(DAY(Data1) AS VARCHAR(2)),2) + ' ' + '00:00:00.000' ) AND ( CAST(YEAR(Data1) AS VARCHAR(4)) + '-' + RIGHT('00' + CAST(MONTH(Data1) AS VARCHAR(2)),2) + '-' + RIGHT('00' + CAST(DAY(Data1) AS VARCHAR(2)),2) + ' ' + '23:59:59.999' )
Alx81 =)

http://blogs.dotnethell.it/suxstellino

bluland Profilo | Guru

grande funziona ! graziee
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