Conversione stringa in data

venerdì 28 novembre 2008 - 17.25

Idea Grip Profilo | Newbie

Buonasera a tutti, sto cercando di migrare da access a SqlExpress.
Ho una query che non riesco a convertire:
"select distinct numfattura,cliente,data,codcliente,stato,numfatturarif,fatturam from elencofatture where cdate(data)'>= '" & Format(CDate(da), "MM/dd/yyyy") & "' and cdate(data)<= '" & Format(CDate(a), "MM/dd/yyyy") & "'" & " order by data"

Praticamente il mio problema è il primo cdate(data) che in access viene accettato mentre in SqlExpress no.

Purtroppo il cdate(data) ci deve essere perchè la data in questione è in formato stringa (non posso modificarla dal database).

Chiedo consigli a chi è più esperto di me, grazie

lbenaglia Profilo | Guru

>Purtroppo il cdate(data) ci deve essere perchè la data in questione
>è in formato stringa (non posso modificarla dal database).

Questo è un grosso errore, dato che per valutare la query dovrai castare a datetime TUTTE le righe della tabella, comportando un decadimento significativo delle prestazioni.

In che formato è espressa la data?
Se per qualche motivo non puoi permetterti di modificare il data type di questa colonna, non puoi aggiungerne una calcolata alla tabella rendendola persistente ed eseguire le tue query su quest'ultima?

>Chiedo consigli a chi è più esperto di me, grazie
Prego.

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

Idea Grip Profilo | Newbie

La data è in formato testo in access che migrata in sqlexpress è in formato nvarchar(20).
Non mi è permesso di modificare questi tipi di dati.

Con cosa sostituisco il cdate(data)? ho provato datetime(data) ma non funziona e nemmeno cast(datetime(data)).
Grazie

lbenaglia Profilo | Guru

>La data è in formato testo in access che migrata in sqlexpress
>è in formato nvarchar(20).
Non ci siamo capiti, intendevo dire come "è scritta" quella data?
Che separatore è stato usato (sempre che sia stato usato)?
Il formato mi serve per suggerirti le corrette funzioni per poter castare la stringa in data.

>Non mi è permesso di modificare questi tipi di dati.
E' meglio che non dica niente...

>Con cosa sostituisco il cdate(data)? ho provato datetime(data)
>ma non funziona e nemmeno cast(datetime(data)).
Tu rispondi alla domanda, poi ti dico come fare
Già che ci sei, posta il comando di CREATE TABLE della tabella.

>Grazie
Prego

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

Idea Grip Profilo | Newbie

La data è scritta cosi: 01/01/2000

Sono in vb.net e devo popolare una griglia, ti posto tutto quello che ho scritto nella routine:

Dim objconnessione As New SqlConnection("Integrated Security=SSPI;Persist Security Info=False;User ID=" & User & ";Initial Catalog=TirSQL;Data Source=" & Server & "\SQLEXPRESS")

Dim objdataadapter1 As New SqlDataAdapter()
Dim objdataset1 As New DataSet()

objdataadapter1.SelectCommand = New SqlCommand
objdataadapter1.SelectCommand.Connection = objconnessione

'datadal e dataal sono due DateTimePicker
da = DataDal.Value
a = DataAl.Value

'carico la query
objdataadapter1.SelectCommand.CommandText = "select distinct numfattura,cliente,data,codcliente,stato,numfatturarif,fatturam from elencofatture where cast(data as datetime) >= '" & Format(CDate(da), "dd/MM/yyyy") & "' and cast data as datetime <= '" & Format(CDate(a), "dd/MM/yyyy") & "'" & " order by cast data as datetime"

objdataadapter1.SelectCommand.CommandType = CommandType.Text

'connessione al DB
objconnessione.Open()

'riempimento dei dati dal DB
objdataadapter1.Fill(objdataset1, "elencofatture")

'chiusura DB
objconnessione.Close()

e poi utilizzo objdataset1 per popolare la griglia

lbenaglia Profilo | Guru

>La data è scritta cosi: 01/01/2000
Quindi nel formato DD/MM/YYYY?

Osserva il seguente esempio:

USE tempdb; GO CREATE TABLE dbo.ElencoFatture( numfattura int NOT NULL PRIMARY KEY, cliente varchar(10) NOT NULL, data char(10) NOT NULL ); INSERT dbo.ElencoFatture VALUES (1, 10, '01/01/2000') , (2, 10, '02/01/2000') , (3, 20, '14/12/2003') , (4, 30, '15/12/2003') , (5, 30, '06/05/2008'); GO ALTER TABLE dbo.ElencoFatture ADD data2 AS CAST( SUBSTRING(data, 7, 4) -- Anno + SUBSTRING(data, 4, 2) -- Mese + SUBSTRING(data, 1, 2) -- Giorno AS smalldatetime); GO SELECT * FROM dbo.ElencoFatture; /* Output: numfattura cliente data data2 ----------- ---------- ---------- ----------------------- 1 10 01/01/2000 2000-01-01 00:00:00 2 10 02/01/2000 2000-01-02 00:00:00 3 20 14/12/2003 2003-12-14 00:00:00 4 30 15/12/2003 2003-12-15 00:00:00 5 30 06/05/2008 2008-05-06 00:00:00 (5 row(s) affected) */ SELECT * FROM dbo.ElencoFatture WHERE data2 BETWEEN '20031201' AND '20031215'; /* Output: numfattura cliente data data2 ----------- ---------- ---------- ----------------------- 3 20 14/12/2003 2003-12-14 00:00:00 4 30 15/12/2003 2003-12-15 00:00:00 (2 row(s) affected) */ DROP TABLE dbo.ElencoFatture;

Come vedi ho utilizzato la funzione SUBSTRING per estapolare anno mese e giorno senza alcun separatore dalla stringa, castando il tutto a smalldatetime (se utilizzi SQL Server 2008 Express puoi utilizzare anche il nuovo data type date).
Infine aggiungo alla tabella una nuova colonna calcolata basata sull'elaborazione appena descritta.

Ciao!

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

Idea Grip Profilo | Newbie

Grazie infinite lBenigaglia, è perfetto 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