Gestire date in sql server 2005 in vb.2008

martedì 24 novembre 2009 - 22.17

basicdany Profilo | Expert

salve a tutti, riscrivendo un applicazione fatta in vb con db access a sql server 2005, ho riutilizzazto una query di ricerca fra campi date:

SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert> #11/25/2009# AND DataInsert < #11/27/2009# OR DataInsert = #11/25/2009# OR Datainsert= #11/27/2009#)"

CON QUESTA QUERY PRATICAMENTE PRENDO TUTTi I RECORD CON DATA DA 25/11/2009 A 27/11/2009 COMPRESO I RECORD CON DATA 25/11/2009 E 27/11/2009

dove datainsert e il campo del db sql di tipo date, :

1)con il # mi da errore, senza cancelleto non restituisce niente, dove sbaglio in access 2003 funzionava
2)i campi datainsert viene visualizzato con i secondi, nel db sql è possibile impostare il formata data senza secondi senza farlo io via codice.

grazie a tutti come sempre!

lbenaglia Profilo | Guru

>salve a tutti, riscrivendo un applicazione fatta in vb con db
>access a sql server 2005, ho riutilizzazto una query di ricerca
>fra campi date:
>
>SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert>
>#11/25/2009# AND DataInsert < #11/27/2009# OR DataInsert =
>#11/25/2009# OR Datainsert= #11/27/2009#)"
>
>CON QUESTA QUERY PARTICAMENTE PRENDO TUTTE I RECORDO CON DATA
>DA 25/11/2009 A 27/11/2009 COMPRESO I RECORD CON DATA 25/11/2009
>E 27/11/2009
>
>dove datainsert e il campo del db sql di tipo date, :
>
>1)con il # mi da errore, senza cancelleto non restituisce niente,
>dove sbaglio in access 2003 funzionava

Ciao Daniele,

Quel formato non è supportato da SQL Server.
Per non dare adito a fraintendimenti, le date si possono specificare nel formato 'YYYYMMDD' e le informazioni di data e ora come 'YYYYMMDD hh:mm:ss.ms'.

>2)i campi datainsert viene visualizzato con i secondi, nel db
>sql è possibile impostare il formata data senza secondi senza
>farlo io via codice.
Le formattazioni vanno eseguite SEMPRE lato client in base alle regional option impostate sull'OS per l'utente in logon.
I data type Date e Time sono stati introdotti a partire con SQL Server 2008, mentre prima esistevano solo datetime e smalldatetime con sia l'informazione data che quella oraria ma con range di validità e precisione differenti.
Sui Books Online troverai i dettagli:
http://msdn.microsoft.com/it-it/library/ms187819(SQL.90).aspx

In questo articolo di Tibor viene spiegato come gestire correttamente tali data type:
http://www.karaszi.com/SQLServer/info_datetime.asp

>grazie a tutti come sempre!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

grazie per la celere risposta, praticamente, come eseguo quel tipo di query in sql server 2005 e quindi:

1)nel db di sql basta settare il tipo di capo come date?

2)La query postata sopra come deve essere scritta per poter funzionanare in sql server 2005?:

SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert> #11/25/2009# AND DataInsert < #11/27/2009# OR DataInsert = #11/25/2009# OR Datainsert= #11/27/2009#)"

la query deve restituire tutti i record che hanno il range di date da...a... inclusi i giorni stessi.


n.b.
chiaramente sql server ha bisogno di essere studiato e altro, io per il momento ho bisogno solo di scrivere solo questa query,sono bloccato perche ho questi problemi sulle date, le altre sintassi di sql non ho avuto grossi problemi a farle eseguire da sql server 2005

grazie aspetto risposta grazie.

motogpdesmo16 Profilo | Senior Member

Se il campo è stato dichiarato come SmallDateTime, io mi son sempre trovato bene facendo utilizzando, come giustamente suggerito da Lorenzo, la sintassi YYYYMMDD. Nel tuo caso ti potrei consigliare anche di utilizzare la funzione BETWEEN che ti consente di includere anche gli estremi dell'intervallo senza dover ricorrere ad una funzionante ma "brutta" da vedersi doppia condizione.
La tua query diventerebbe:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Facci sapere

lbenaglia Profilo | Guru

> come eseguo quel
>tipo di query in sql server 2005 e quindi:
>
>1)nel db di sql basta settare il tipo di capo come date?
No dato che SQL Server 2005 non offre il data type date ma solo datetime e smalldatetime.
Quale scegliere? Lo devi decidere tu in base alla precisione ed al range di validità che ti serve.

>2)La query postata sopra come deve essere scritta per poter funzionanare
>in sql server 2005?:
>
>SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert>
>#11/25/2009# AND DataInsert < #11/27/2009# OR DataInsert =
>#11/25/2009# OR Datainsert= #11/27/2009#)"
>
>la query deve restituire tutti i record che hanno il range di
>date da...a... inclusi i giorni stessi.

SELECT * FROM dbo.anagrafica WHERE idagenzia = 2 AND DataInsert >= '20091125' AND DataInsert < '20091128';

Ovvero restituisci tutte le righe con idagenzia = 2 e DataInsert compresa tra la mezzanotte del 25 novembre ed il termine del 27 novembre 2009.

>n.b.
>chiaramente sql server ha bisogno di essere studiato e altro,
>io per il momento ho bisogno solo di scrivere solo questa query,sono
>bloccato perche ho questi problemi sulle date, le altre sintassi
>di sql non ho avuto grossi problemi a farle eseguire da sql server
>2005
Nei link indicati trovavi tutto il necessario per scrivere la query.

>grazie aspetto risposta grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

>Se il campo è stato dichiarato come SmallDateTime, io mi son
>sempre trovato bene facendo utilizzando, come giustamente suggerito
>da Lorenzo, la sintassi YYYYMMDD. Nel tuo caso ti potrei consigliare
>anche di utilizzare la funzione BETWEEN che ti consente di includere
>anche gli estremi dell'intervallo senza dover ricorrere ad una
>funzionante ma "brutta" da vedersi doppia condizione.
>La tua query diventerebbe:
>SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert BETWEEN
>20091125 AND 20091127)
>
>Facci sapere

Occhio che:

1) Le date vanno espresse come literals, ovvero racchiuse tra singoli apici;
2) Non consideri l'informazione oraria, quindi stai escludendo le righe del 27/11 successive alle 0.00

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

>Se il campo è stato dichiarato come SmallDateTime, io mi son
>sempre trovato bene facendo utilizzando, come giustamente suggerito
>da Lorenzo, la sintassi YYYYMMDD. Nel tuo caso ti potrei consigliare
>anche di utilizzare la funzione BETWEEN che ti consente di includere
>anche gli estremi dell'intervallo senza dover ricorrere ad una
>funzionante ma "brutta" da vedersi doppia condizione.
>La tua query diventerebbe:
>SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert BETWEEN
>20091125 AND 20091127)
>
>Facci sapere

Occhio che:

1) Le date vanno espresse come literals, ovvero racchiuse tra singoli apici;
2) Non consideri l'informazione oraria, quindi stai escludendo le righe del 27/11 successive alle 0.00

Ciao!


LA QUERY FUNZIONA, PERO PRENDE TUTTI I RECORD CON DATA DA 25/11/2009 A 26/11/2009, QUINDI NON PRENDE QUELLI DEL 27/11/2009, QUESTO E UN PO STRANO SAPRESTI DIRMI PERCHE?

1)MI CHIEDO COME SI DICHIARA DI TIPO SmallDateTime IL CAMPO, IO FACCIO COSI:

Dim DataDa As Date = txtDataDa.Text
Dim Dataa As Date = txtDataa.Text
Dim AppoDataDa As String = CFunzioni.FormattaData(DataDa)
Dim AppoDataA As String = CFunzioni.FormattaData(Dataa)

SELECT * FROM anagrafica WHERE idagenzia=2 AND AND (DataInsert BETWEEN '" & AppoDataDa & "' AND '" & AppoDataA & "')"

2)NELLA GRIGLIA CHE CARICO I RECORD LA DATA MI APPARE CON I SECONDI, COME FACCIO PER NON FAR APPARIRE I SECONDI,IO CARICO COSI LA GRIGLIA

Dim CnGriglia As New SqlConnection(ConnectionString)
Dim sql As String

sql = "SELECT * FROM QRicerca"

Dim da1 As New SqlDataAdapter(sql, CnGriglia)
Dim ds1 As New DataSet

CnGriglia.Open()
da1.Fill(ds1, "Immobili")
DataGridImmobili.DataSource = ds1.Tables("Immobili")


With DataGridImmobili

.DefaultCellStyle.WrapMode = DataGridViewTriState.True 'per autosize
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders 'per autosize
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
.CellBorderStyle = DataGridViewCellBorderStyle.Single
.GridColor = Color.Blue
.RowHeadersVisible = False
.ReadOnly = True

.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False

imgColVisualizza.Name = "V"
imgColVisualizza.Width = 30
imgColVisualizza.Image = Image.FromFile(Application.StartupPath & "\showDetail.gif")
imgColVisualizza.DisplayIndex = 0
.Columns.Add(imgColVisualizza)

.Columns("ID").Width = 50
.Columns("ID").HeaderText = "Cod.Rif." 'modificare testa

.Columns("DataInsert").Width = 100
.Columns("DataInsert").HeaderText = "Data" 'modificare testa



GRAZIE TANTO ASPETTO AIUTO.

lbenaglia Profilo | Guru

>LA QUERY FUNZIONA, PERO PRENDE TUTTI I RECORD CON DATA DA 25/11/2009
>A 26/11/2009, QUINDI NON PRENDE QUELLI DEL 27/11/2009, QUESTO
>E UN PO STRANO SAPRESTI DIRMI PERCHE?
Dipende se parli della mia o quella di motogpdesmo16: la mia restituisce l'intervallo richiesto, l'altra no e ho spiegato sopra il motivo.

>MI CHIEDO COME SI DICHIARA DI TIPO SmallDateTime IL CAMPO, IO
>FACCIO COSI:
>
> Dim DataDa As Date = txtDataDa.Text
> Dim Dataa As Date = txtDataa.Text
>Dim AppoDataDa As String = CFunzioni.FormattaData(DataDa)
>Dim AppoDataA As String = CFunzioni.FormattaData(Dataa)
>
>Sql16 = " AND (DataInsert BETWEEN '" & AppoDataDa & "' AND '"
>& AppoDataA & "')"
Non ci siamo
Il mio consiglio è quello di incapsulare la query in una stored proicedure parametrica in modo da ottenere prestazioni migliori, evitare attacchi di SQL Injection e scrivere codice più pulito senza inutili cast.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

ciao, grazie per l'nteresse, il problema che ti spiegavo e utilizzando la tua query ti rispiego utilizzando la tua query:

SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert BETWEEN 20091125 AND 20091127)

Mi recupera i record che vanno dal 25 11 2009 a 26 11 2009, quindi non mi prendere i record con data 27 11 2009, cosa strana perche se avrebbe logica non doveva prendere anche quel del 25 11 2009.
So che si possono utilizzare le stored, ma mi sembra molto prematuro adesso, visto che sono alle prime armi con sql, per ora ho ottenuto tutto cio' che ottenevo in access, mi e rimasto questo problema con le date..
spero posso aiutarmi.

n.b. ho provato a fare una query con datainsert=20091127 , ma non funziona la query non restituisce niente,e strano anche questo

grazie

lbenaglia Profilo | Guru

>ciao, grazie per l'nteresse, il problema che ti spiegavo e utilizzando
>la tua query ti rispiego utilizzando la tua query:
>
>SELECT * FROM anagrafica WHERE idagenzia=2 AND (DataInsert BETWEEN
>20091125 AND 20091127)
Questa NON è la mia query.
La mia è:

SELECT * FROM dbo.anagrafica WHERE idagenzia = 2 AND DataInsert >= '20091125' AND DataInsert < '20091128';

>Mi recupera i record che vanno dal 25 11 2009 a 26 11 2009, quindi
>non mi prendere i record con data 27 11 2009, cosa strana perche
>se avrebbe logica non doveva prendere anche quel del 25 11 2009.
Ma no, il motivo te l'ho già spiegato sopra!
Quella che hai postato restuisce le righe comprese tra le 00:00 del 25/11 e le 00:00 del 27/11 estremi compresi, quindi sono escluse tutte le righe del 27 successive alla mezzanotte esatta.

>So che si possono utilizzare le stored, ma mi sembra molto prematuro
>adesso, visto che sono alle prime armi con sql, per ora ho ottenuto
>tutto cio' che ottenevo in access, mi e rimasto questo problema
>con le date..
Perché prematuro?

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

HO appena provato la tua query scusami avevo fatto un po di confunsone:

"SELECT * FROM QRicerca WHERE idagenzia=2 AND DataInsert >= '20091125' AND DataInsert < '20091127';"

mi restituisce tutti i record dal 25 11 2009 a 26 11 2009 , non mi prende quelli con 27 11 2009

perche?????

grazie

lbenaglia Profilo | Guru

>perche?????
Il perché l'ho già scritto 2 volte e non lo ripeto.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

ok, ho capito ho riletto bene la risposta precedente, come faccio per prendere tutti del giorno 27, in access non si comportava cosi?
puo essere che devo configurare nel db di non scrivere i secondi,??
grazie

lbenaglia Profilo | Guru

>ok, ho capito ho riletto bene la risposta precedente, come faccio
>per prendere tutti del giorno 27, in access non si comportava
>cosi?
>puo essere che devo configurare nel db di non scrivere i secondi,??
http://www.karaszi.com/SQLServer/info_datetime.asp

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

Puoi indicarmi cosa dovrei farei in sintessi per risolvere il problema, ho visto l'articolo,ma non risco a trovare la soluzione?

ciao grazie

lbenaglia Profilo | Guru

>Puoi indicarmi cosa dovrei farei in sintessi per risolvere il
>problema, ho visto l'articolo,ma non risco a trovare la soluzione?

SELECT * FROM dbo.anagrafica WHERE idagenzia = 2 AND DataInsert >= '20091125' AND DataInsert < '20091128';

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

quindi mi sembra di capire per risolvere aggiungo magari a quello che digita l'utente 1 giorno, in modo da prendere il range compreso il 27?
giusto?

lbenaglia Profilo | Guru

>quindi mi sembra di capire per risolvere aggiungo magari a quello
>che digita l'utente 1 giorno, in modo da prendere il range compreso
>il 27?
>giusto?
Esatto.


--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

basicdany Profilo | Expert

ok, ho aggiunto un giorno al valore dataa e funziona.ciao grazie tanto.
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