Urgente- Convert da NVARCHAR a DATETIME

giovedì 23 novembre 2006 - 15.16

viviana_77 Profilo | Newbie

Ciao a tutti,
ho provato da sql server a convertire(select convert(nvarchar, data_mia, 126)) una data di formato nvarchar a datetime ma credo non vada bene...
sapete aiutarmi?

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>ho provato da sql server a convertire(select convert(nvarchar,
>data_mia, 126)) una data di formato nvarchar a datetime ma credo
>non vada bene...
>sapete aiutarmi?

Così sembra che tu stia convertendo un valore data_mia in nvarchar, con il formato 126 (yyyy-mm-ddThh:mm:ss.mmm (no spaces))..

Dalla tua domanda sembra invece che tu abbia data_mia come nvarchar e che tu voglia ottenere un datetime..

se è questo quello che ti serve, devo chiederti perchè utilizzi un nvarchar (per stringhe unicode) e poi cos'hai all'interno di data_mia.. o meglio in che formato hai la data nel tuo data_mia..

Detto questo possiamo proseguire..






Alx81 =)

http://blogs.dotnethell.it/suxstellino

viviana_77 Profilo | Newbie

Hai ragione...
la data_mia è in formato nvarchar (x es. 31/12/2000) e voglio trasforamrla in datetime.
Mi dice un collega che basta che faccio convert(datetime,data_mia).
E' corretto?

lbenaglia Profilo | Guru

>Hai ragione...
>la data_mia è in formato nvarchar (x es. 31/12/2000) e voglio
>trasforamrla in datetime.
>Mi dice un collega che basta che faccio convert(datetime,data_mia).
>E' corretto?

Se la login alla quale ti connetti all'istanza ha come default language l'italiano allora si, altrimenti otterrai una bella eccezione di cast.
L'errore numero 1 è quello di utilizzare i data type sbagliati, il secondo è utilizzare un formato localizzato per la definizione delle date.

Se proprio non puoi modificare il data type della colonna da nvarchar a datetime (o smalldatetime) non ti resta che parsare la stringa, ma la soluzione resta comunque una porcata...

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

alx_81 Profilo | Guru

>Hai ragione...
>la data_mia è in formato nvarchar (x es. 31/12/2000) e voglio
>trasforamrla in datetime.
>Mi dice un collega che basta che faccio convert(datetime,data_mia).
>E' corretto?

se sei sicura che il tuo sql server sia italiano, basta che usi la CAST..
CAST('31/12/2005' AS DATETIME)


anche se ti consiglio di utilizzare il formato ISO (ssaammgg), così anche se il server non è italiano, sei sicura di non ottenere errori..
CAST('20051231' AS DATETIME)

ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>anche se ti consiglio di utilizzare il formato ISO (ssaammgg)

Io invece ti consiglio di utilizzare il data type corretto per memorizzare le informazioni data e ora, ovvero datetime o smalldatetime in base all'accuratezza richiesta.

Se il problema è semplicemente quello della formattazione in lettura, risolvi tutto con una banalissima CONVERT:

"Che formato devo utilizzare per la definizione delle date in SQL Server ?"
http://www.dotnethell.it/tips/SQLServerDates.aspx

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

viviana_77 Profilo | Newbie

Ho necessariamente la data in formato nvarchar e devo metterla in formato datetime e la lingua è l'inglese...

alx_81 Profilo | Guru

>Ho necessariamente la data in formato nvarchar e devo metterla
>in formato datetime e la lingua è l'inglese...

Infatti, ISO dovresti usarlo solo in lettura, effettuare la conversione e poi metterlo in un datatype corretto, come datetime o smalldatetime.. ed è quello che fai nel tuo esempio Lorenzo..

per questo indicavo a viviana_77 di convertire in SSAAMMGG il suo nvarchar e poi di impostarlo in un datetime..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Infatti, ISO dovresti usarlo solo in lettura, effettuare la conversione
>e poi metterlo in un datatype corretto, come datetime o smalldatetime..
>ed è quello che fai nel tuo esempio Lorenzo..

Eh no.
Tu hai scritto:

> anche se ti consiglio di utilizzare il formato ISO (ssaammgg), così anche se il server non è italiano,
> sei sicura di non ottenere errori.. CAST('20051231' AS DATETIME)
Questo cast che significa? Che cos'è quella stringa '20051231' ? Il valore di una colonna STRINGA?

>per questo indicavo a viviana_77 di convertire in SSAAMMGG il
>suo nvarchar e poi di impostarlo in un datetime..
Non ho capito, spiegati con un esempio.

Comunque, Viviana non ne vieni fuori così facilmente dato che gli errori (eh si sono 2) sono commessi a monte.
Puoi seguire 2 strade (entrambe orrende):

1) impostare per la connessione il formato data italiano oppure cambiare la lingua da inglese ad italiano ed effettuare il cast;
2) parsare la stringa definendo una data in formato ISO YYYYMMDD e poi castarla a datetime o smalldatetime.

USE tempdb; GO CREATE TABLE dbo.myTable( myItalianDate char(10) NOT NULL ); INSERT dbo.myTable VALUES('12/06/1971'); INSERT dbo.myTable VALUES('01/01/2000'); INSERT dbo.myTable VALUES('31/12/2000'); GO /* Soluzione 1: Imposto il formato data Italiano cambiano lingua */ SELECT @@LANGUAGE AS Lingua; /* Output: Lingua ------------ us_english (1 row(s) affected) */ SET LANGUAGE italiano; /* Output L'impostazione della lingua è stata sostituita con Italiano. */ SELECT CAST(myItalianDate as smalldatetime) AS Date FROM dbo.myTable; /* Output: Date ----------------------- 1971-06-12 00:00:00 2000-01-01 00:00:00 2000-12-31 00:00:00 (3 row(s) affected) */ /* Soluzione 2: parsing */ SELECT CAST( RIGHT(myItalianDate, 4) + -- Anno SUBSTRING(myItalianDate, 4, 2) + -- Mese LEFT(myItalianDate, 2) -- Giorno AS smalldatetime) AS Data FROM dbo.myTable; /* Output: Data ----------------------- 1971-06-12 00:00:00 2000-01-01 00:00:00 2000-12-31 00:00:00 (3 row(s) affected) */ DROP TABLE dbo.myTable;

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

alx_81 Profilo | Guru

>Eh no.
>Tu hai scritto:
>
>> anche se ti consiglio di utilizzare il formato ISO (ssaammgg), così anche se il server non è italiano,
>> sei sicura di non ottenere errori.. CAST('20051231' AS DATETIME)
>Questo cast che significa? Che cos'è quella stringa '20051231'

è la sua data nvarchar messa in formato ssaammgg..
quello che le i chiede è la conversione.. io le ho dato la funzione di conversione.. usando una stringa (il suo nvarchar convertito in ssammgg)..

>
>>per questo indicavo a viviana_77 di convertire in SSAAMMGG il
>>suo nvarchar e poi di impostarlo in un datetime..
quello che lei ottiene con la cast è un datetime..
da qui il datetime verrà scritto nel corretto datatype, se necessario.. non posso sapere quello che vuol fare lei..
Non ci vedo tutta questa stranezza..
tu, nel tuo esempio parti da ssammgg e scrivi su tabella su campi datetime (o smalldatetime)..

io le dico di convertire l'nvarchar in ssammg e poi di castarlo in datetime se le serve per la conversione..
tutto qui..


forse mi sono spiegato male..
ma non mi sembra una grossa eresia dai
Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>è la sua data nvarchar messa in formato ssaammgg..
>quello che le i chiede è la conversione.. io le ho dato la funzione
>di conversione.. usando una stringa (il suo nvarchar convertito
>in ssammgg)..

Non mi sembra corretto consigliarle di modificare la logica di memorizzazione delle date dal formato italiano a quello ISO, dato che a questo punto fa prima a cambiare direttamente il data type, non trovi?

Viviana ha detto che ha questa situazione e non può cambiarla, quindi il tuo suggerimento non lo considero una soluzione al problema.

>ma non mi sembra una grossa eresia dai
Non è eresia, è una mezza vaccata (invece che una vaccata intera)

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

alx_81 Profilo | Guru

>Non mi sembra corretto consigliarle di modificare la logica di
>memorizzazione delle date dal formato italiano a quello ISO,
>dato che a questo punto fa prima a cambiare direttamente il data
>type, non trovi?

Quello che vorrei capire, è cosa cambia dalla mia soluzione con la cast('ssaammgg' as datetime) alla tua seconda..
SELECT
CAST(
RIGHT(myItalianDate, 4) + -- Anno
SUBSTRING(myItalianDate, 4, 2) + -- Mese
LEFT(myItalianDate, 2) -- Giorno
AS smalldatetime) AS Data
FROM dbo.myTable;

a me sembrano del tutto equivalenti..

>
>Viviana ha detto che ha questa situazione e non può cambiarla,
>quindi il tuo suggerimento non lo considero una soluzione al
>problema.
>
>>ma non mi sembra una grossa eresia dai
>Non è eresia, è una mezza vaccata (invece che una vaccata intera)
>
Quindi intendi che, siccome il problema è a monte, ogni soluzione proposta è terribile?

Non vorrei continuare questa discussione, anche perchè già dai nostri primi post viviana_77 ha già quello che le serve, almeno spero.. per orrende che siano le strade, si possono utilizzare, avendo un problema a monte senza possibilità di cambiare..


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

Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Quello che vorrei capire, è cosa cambia dalla mia soluzione con
>la cast('ssaammgg' as datetime) alla tua seconda..
>SELECT
> CAST(
> RIGHT(myItalianDate, 4) + -- Anno
> SUBSTRING(myItalianDate, 4, 2) + -- Mese
> LEFT(myItalianDate, 2) -- Giorno
> AS smalldatetime) AS Data
>FROM dbo.myTable;
>
>a me sembrano del tutto equivalenti..

La differenza ENORME è che la mia seconda soluzione NON NECESSITA ALCUNA MODIFICA ALLA BASE DATI ED ALLA APPLICAZIONE mentre la tua richiede necessariamente un UPDATE di TUTTE LE RIGHE DELLA TABELLA nel formato ISO YYYYMMDD ed inoltre LA MODIFICA DELL'APPLICAZIONE in modo che inserisca le date nel formato ISO.
Se Viviana potesse effettuare modifiche alla struttura del db ed alla applicazione potrebbe fare le cose per bene modificando il data type della colonna da nvarchar a datetime ma ha già ribadito che non può.

>Quindi intendi che, siccome il problema è a monte, ogni soluzione
>proposta è terribile?
>
>Non vorrei continuare questa discussione, anche perchè già dai
>nostri primi post viviana_77 ha già quello che le serve, almeno
>spero.. per orrende che siano le strade, si possono utilizzare,
>avendo un problema a monte senza possibilità di cambiare..
>

Le soluzioni proposte risolvono il problema specifico sollevato da Viviana, ma lei stessa quasi certamente si troverà di fronte ad altri problemi di questo tipo (l'impossibilità di eseguire calcoli sulle date, ordinamenti, ecc. senza prima effettuare un cast esplicito della colonna causando pesanti problemi prestazionali).

La soluzione c'è ed è semplicissima, progettare applicazioni e basi di dati nel modo corretto

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

alx_81 Profilo | Guru

Ultima cosa...
Secondo me non sappiamo cosa lei in realtà debba fare.. Non possiamo pensare ad una applicazione (che non conosciamo) o ad una base dati.. Con le tue giustificazioni la tua soluzione è perfetta, ci mancherebbe.. ma lei, e ribadisco, ha chiesto SOLO come si converte.. tutto qui..
ma è solo il mio punto di vista..
Suggerisco di finire così:
>
>La soluzione c'è ed è semplicissima, progettare applicazioni
>e basi di dati nel modo corretto
Questa la condivido appieno! Ed è un ottima frase..
ciao a tutti..

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

Alx81 =)

http://blogs.dotnethell.it/suxstellino
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