[sql server 2005] problema con le date

mercoledì 09 gennaio 2008 - 13.44

escaflowne Profilo | Junior Member

Ciao a tutti,
ho una procedura stupidissima che prende in input un po' di campi e fa una stupida insert into.
Ho un problema con un campo che è di tipo smalldatetime.
In pratica io do in pasto una varchar fatta così '07/01/2008' ma l'errore che la procedura mi genera è l'impossibilità a convertire la stringa nel tipo smalldatetime.
Ho provato con

cast('07/01/2008' as smalldatetime)
convert(smalldatetime, '07/01/2008')

ma l'errore è sempre quello.

Mi potete dare una mano?

Grazie mille

lbenaglia Profilo | Guru

>Ho un problema con un campo che è di tipo smalldatetime.
>In pratica io do in pasto una varchar fatta così '07/01/2008'
>ma l'errore che la procedura mi genera è l'impossibilità a convertire
>la stringa nel tipo smalldatetime.
>Ho provato con
>
>cast('07/01/2008' as smalldatetime)
>convert(smalldatetime, '07/01/2008')
>
>ma l'errore è sempre quello.
>
>Mi potete dare una mano?
Per evitare qualunque problema legato alla interpretazione delle informazioni datetime utilizza SEMPRE il formato ANSI SQL 'YYYYMMDD'.
Tutti i dettagli sul sito di Tibor:
http://www.karaszi.com/SQLServer/info_datetime.asp

>Grazie mille
Prego.

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

escaflowne Profilo | Junior Member

>Per evitare qualunque problema legato alla interpretazione delle
>informazioni datetime utilizza SEMPRE il formato ANSI SQL 'YYYYMMDD'.
>Tutti i dettagli sul sito di Tibor:
>http://www.karaszi.com/SQLServer/info_datetime.asp
>

non posso che darti ragione.
Ho provato, tuttavia, sia a passare come stringa la data nel formato come mi suggerisci tu che mettere all'interno della select un cast al tipo smalldatetime con questo formato (in pratica ho passato 20080107) però l'errore è sempre lo stesso.
Se può servire se faccio:
declare @aa varchar(10)
declare @bb smalldatetime

set @aa = '20080107'
set @bb = cast(@aa as smalldatetime)
print @bb

mi restituisce "07 Gen 2008"

hmmm sono estremamente confuso

lbenaglia Profilo | Guru

>non posso che darti ragione.
Grazie

>Ho provato, tuttavia, sia a passare come stringa la data nel
>formato come mi suggerisci tu che mettere all'interno della select
>un cast al tipo smalldatetime con questo formato (in pratica
>ho passato 20080107) però l'errore è sempre lo stesso.
Impossibile

>Se può servire se faccio:
>declare @aa varchar(10)
>declare @bb smalldatetime
>
>set @aa = '20080107'
>set @bb = cast(@aa as smalldatetime)
>print @bb
>
>mi restituisce "07 Gen 2008"

Scusa, secondo te la stringa '20080107' a che data dovrebbe corrispondere?
SQL Server offre due data types per la memorizzazione delle date: datetime e smalldatetime.

datetime
--------
Range di validità: 1 gennaio 1753 - 31 dicembre 9999 con una precisione pari a 0.00333 secondi.
Bytes occupati: 8 (2 coppie di interi di 4 bytes)
- i primi 4 per la memorizzazione dei giorni prima o dopo l'1 gennaio 1900
- gli altri 4 per la memorizzazione dei millisecondi dopo la mezzanotte

smalldatetime
-------------
Range di validità: 1 gennaio 1900 - 6 giugno 2079 con una precisione al minuto.
Bytes occupati: 4 (2 coppie di interi di 2 bytes)
- i primi 2 per la memorizzazione dei giorni dopo l'1 gennaio 1900
- gli altri 2 per la memorizzazione dei minuti dopo la mezzanotte

Come vedi le date sono memorizzate internamente come 2 coppie di interi.
Quella che tu vedi non è altro che una formattazione di questi interi effettuata dal client.

>hmmm sono estremamente confuso
Ora, prova a spiegarci cosa vuoi fare

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

escaflowne Profilo | Junior Member


>Impossibile
>

cazzarola ora mi metti i dubbi



>Scusa, secondo te la stringa '20080107' a che data dovrebbe corrispondere?
>

si si, vero, è giusto, solo che pensavo che la rappresentazione della data in questo modo potesse poi non essere interpretata correttamente nella insert (nel campo smalldatetime)

>Ora, prova a spiegarci cosa vuoi fare
>

eheh,
dunque, ho questa procedura (semplifico)

create procedure insTicket @pnumero int, @pdataVariazione varchar(10) as begin insert into tblTicket (protocollo, dataVariazione) as (@pnumero, @pdataVariazione) end

ora, io pensavo di richiamarla in questo modo

exec insTicket 9, '07/01/2008'
ma non mi funziona
e neanche questo funziona
exec insTicket 9, cast('07/01/2008' as smalldatatime)

e mi sembrava che neanche questo funzionasse
exec insTicket 9, cast('20080107' as smalldatatime)

solito errore 295 state 3 errore di conversione
Volevo capire cosa stessi sbagliando

Grazie ancora (per la pazienza soprattutto )

lbenaglia Profilo | Guru

>>Scusa, secondo te la stringa '20080107' a che data dovrebbe corrispondere?
>>
>
>si si, vero, è giusto, solo che pensavo che la rappresentazione
>della data in questo modo potesse poi non essere interpretata
>correttamente nella insert (nel campo smalldatetime)
Ed infatti una stringa nel formato ANSI SQL 'YYYYMMDD' verrà SEMPRE convertita implicitamente in un valore datetime o smalldatetime indipendentemente dalle impostazioni di sessione o dalla lingua di default associata alla login utilizzata per autenticarsi all'istanza:

USE tempdb; CREATE TABLE dbo.Date( Data smalldatetime NOT NULL ); INSERT dbo.Date VALUES('20080101'); INSERT dbo.Date VALUES('20080102'); INSERT dbo.Date VALUES('20080103'); INSERT dbo.Date VALUES('20080104'); INSERT dbo.Date VALUES('20080105'); INSERT dbo.Date VALUES('20080106'); INSERT dbo.Date VALUES('20080107'); SELECT * FROM dbo.Date; /* Output: Data ----------------------- 2008-01-01 00:00:00 2008-01-02 00:00:00 2008-01-03 00:00:00 2008-01-04 00:00:00 2008-01-05 00:00:00 2008-01-06 00:00:00 2008-01-07 00:00:00 (7 row(s) affected) */ DROP TABLE dbo.Date;

>dunque, ho questa procedura (semplifico)
>
>create procedure insTicket
> @pnumero int,
> @pdataVariazione varchar(10)
>as
>begin
>insert into tblTicket (protocollo, dataVariazione) as (@pnumero,
>@pdataVariazione)
>end
>
>ora, io pensavo di richiamarla in questo modo
>
>exec insTicket 9, '07/01/2008'
>ma non mi funziona
>e neanche questo funziona
>exec insTicket 9, cast('07/01/2008' as smalldatatime)
E ti ho spiegato il motivo.

>e mi sembrava che neanche questo funzionasse
>exec insTicket 9, cast('20080107' as smalldatatime)
Casti una stringa in smalldatetime, il parametro è stringa quindi la ricasti a stringa, poi la insert la ricasta a smalldatetime...

Ora, se vuoi un consiglio modifica il data type del prametro @pdataVariazione a smalldatetime e richiama la sp semplicemente specificando la data come stringa 'YYYYMMDD' o tramite una variabile smalldatetime.

>Grazie ancora (per la pazienza soprattutto )
Prego.

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

escaflowne Profilo | Junior Member

>E ti ho spiegato il motivo.
>
vero, credo di aver compreso


>Casti una stringa in smalldatetime, il parametro è stringa quindi
>la ricasti a stringa, poi la insert la ricasta a smalldatetime...
>
>Ora, se vuoi un consiglio modifica il data type del prametro
>@pdataVariazione a smalldatetime e richiama la sp semplicemente
>specificando la data come stringa 'YYYYMMDD' o tramite una variabile
>smalldatetime.

seguirò il tuo consiglio!

Grazie ancora
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5