Conversione da stringa a data su SQL2000

martedì 19 febbraio 2008 - 16.23

fotw Profilo | Newbie

Problema:

Ho un tabella importata da files ASCII (conversioni da vecchio gestionale) dove la data
e' espressa in formato VARCHAR di 8 ddmmyyyy

Devo convertirla in formato data di SQL2000 (lingua inglese)

Quale comando devo utilizzare

Ho provato CONVERT e CAST facendo anche il parse della stringa (ho provato con formato dd/mm/yyyy, yyyy/mm/dd, mm/dd/yyyy) ma non ho ottenuto altro che il messaggio

Server: Msg 241, Level 16, State 1, Line 1
Syntax error converting datetime from character string.


Aiuto!!

Grazie

ps. Esempio di parse stringa per portarla nel formato mm/dd/yyyy
CAST((SUBSTRING(my_data, 3, 2) + '/' + SUBSTRING(my_data, 1, 2) + '/' + SUBSTRING(my_data, 5, 4)) AS DATETIME)

amelix Profilo | Expert

>e' espressa in formato VARCHAR di 8 ddmmyyyy
>CAST((SUBSTRING(my_data, 3, 2) + '/' + SUBSTRING(my_data, 1,
>2) + '/' + SUBSTRING(my_data, 5, 4)) AS DATETIME)

A sentimento il cast sbaglia sull'anno...
Come substring gli hai dato lunghezza 4...
Ad esempio 750113 nel tuo esempio diventa: 01/75/13xx

Prova così:
>CAST((SUBSTRING(my_data, 3, 2) + '/' + SUBSTRING(my_data, 5, 2) + '/' + SUBSTRING(my_data, 1, 2)) AS DATETIME)

Guarda qui:
http://www.thescripts.com/forum/thread158093.html (il primo trovato su google con mssql string to date)

Andrea - http://www.MelisWeb.eu/

lbenaglia Profilo | Guru

>Problema:
>
>Ho un tabella importata da files ASCII (conversioni da vecchio
>gestionale) dove la data
>e' espressa in formato VARCHAR di 8 ddmmyyyy
>
>Devo convertirla in formato data di SQL2000 (lingua inglese)
>
>Quale comando devo utilizzare

Il modo migliore per dare in pasto a SQL Server una stringa contenente una data senza dare adito a fraintendimenti è quello di utilizzare il formato ANSI SQL 'YYYYMMDD'.
Visto che nel tuo caso la data è espressa esttamente al contrario, te la puoi cavare facilmente ricorrendo alla funzione SUBSTRING(), recuperando singolarmente anno, mese e giorno e concatenandoli tra di loro:

USE tempdb; CREATE TABLE dbo.Source( SourceID int NOT NULL PRIMARY KEY, DateString varchar(8) NOT NULL ); INSERT dbo.Source VALUES(1, '12061971'); INSERT dbo.Source VALUES(2, '31122007'); INSERT dbo.Source VALUES(3, '19022008'); CREATE TABLE dbo.Destination( DestinationID int NOT NULL PRIMARY KEY, DateValue datetime NOT NULL ); INSERT dbo.Destination SELECT SourceID , SUBSTRING(DateString, 5, 4) + -- Anno SUBSTRING(DateString, 3, 2) + -- Mese SUBSTRING(DateString, 1, 2) -- Giorno FROM dbo.Source; SELECT * FROM dbo.Destination; /* Output: DestinationID DateValue ------------- ----------------------- 1 1971-06-12 00:00:00.000 2 2007-12-31 00:00:00.000 3 2008-02-19 00:00:00.000 (3 row(s) affected) */ DROP TABLE dbo.Source, dbo.Destination;

SQL Server provvederà a castare implicitamente la stringa in un valore datetime.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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