Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Convertire colonna Varchar in data

483 views
Skip to first unread message

Samuel

unread,
Mar 21, 2008, 5:32:45 AM3/21/08
to
Salve, ho un DB fatto con sql server 2005 express.
C'e' una colonna di tipo varchar con dei valori rappresentanti
una data. Questi valori sono tutti in un formato tipo
21/03/2008 10.26.57

E' possibile convertire questa colonna da tipo varchar in tipo datetime ?
Ho provato col management studio express a cambiare il tipo della colonna
ma mi da errore di conversione.

In ogni caso a me servirebbe solo poter fare delle query di
ordinamento su quella colonna.
Se adesso faccio SELEC * FROM miaTabella ORDER BY miaColonna DESC
mi esce un ordinamento alfabetico e non per data.

Lorenzo Benaglia

unread,
Mar 21, 2008, 6:09:03 AM3/21/08
to
Samuel wrote:
> Salve, ho un DB fatto con sql server 2005 express.
> C'e' una colonna di tipo varchar con dei valori rappresentanti
> una data. Questi valori sono tutti in un formato tipo
> 21/03/2008 10.26.57
>
> E' possibile convertire questa colonna da tipo varchar in tipo
> datetime ?

Ciao Samuel,

Potresti:

1) Definire una nuova colonna datetime;
2) Popolarla covertendo opportunamente le date;
3) Eliminare la colonna di origine;
4) Rinominare la nuova colonna datetime con il nome della colonna di
origine.

Vediamo un piccolo esempio:

USE tempdb;

CREATE TABLE dbo.Foo(
FooID int NOT NULL IDENTITY PRIMARY KEY,
Date varchar(19) NOT NULL
);

INSERT dbo.Foo VALUES('21/03/2008 10.26.57');
INSERT dbo.Foo VALUES('22/03/2008 10.26.58');
INSERT dbo.Foo VALUES('23/03/2008 10.26.59');
INSERT dbo.Foo VALUES('24/03/2008 10.27.00');
INSERT dbo.Foo VALUES('25/03/2008 10.27.01');
INSERT dbo.Foo VALUES('26/03/2008 10.27.02');
GO

/* Aggingo la colonna DateNew */
ALTER TABLE dbo.Foo
ADD DateNew datetime NULL;
GO

/* La popolo convertendo le date in formato stringa in datetime */
UPDATE dbo.Foo
SET DateNew = CONVERT(datetime, REPLACE(Date, '.', ':'), 103);

/* Elimino la colonna Date */
ALTER TABLE dbo.Foo
DROP COLUMN Date;

/* Rinomino la colonna DateNew in Date */
EXEC sp_rename
@objname = 'dbo.Foo.DateNew'
, @newname = 'Date'
, @objtype = 'COLUMN';

/* Imposto la colonna Date come NOT NULL */
ALTER TABLE dbo.Foo
ALTER COLUMN Date datetime NOT NULL;

/* Vediamo */
SELECT *
FROM dbo.Foo;

/* Output:

FooID Date
----------- -----------------------
1 2008-03-21 10:26:57.000
2 2008-03-22 10:26:58.000
3 2008-03-23 10:26:59.000
4 2008-03-24 10:27:00.000
5 2008-03-25 10:27:01.000
6 2008-03-26 10:27:02.000

(6 row(s) affected)

*/

DROP TABLE dbo.Foo;

Ciao!

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


VeroToad [MVP]

unread,
Mar 21, 2008, 6:08:03 AM3/21/08
to
Il Fri, 21 Mar 2008 10:32:45 +0100, Samuel ha scritto:

> Salve, ho un DB fatto con sql server 2005 express.
> C'e' una colonna di tipo varchar con dei valori rappresentanti
> una data. Questi valori sono tutti in un formato tipo
> 21/03/2008 10.26.57

Ahi, ahi, ahi :-)

[cut]


> In ogni caso a me servirebbe solo poter fare delle query di
> ordinamento su quella colonna.
> Se adesso faccio SELEC * FROM miaTabella ORDER BY miaColonna DESC
> mi esce un ordinamento alfabetico e non per data.

In questo Script (in cui ho sicuramente commesso errori grossolani) creo
una tabella di prova con un campo Data varchar(), quindi aggiungo un nuovo
campo Data_New che contiene la "conversione" nel naturale datetime del
contenuto di Data:

USE TempDB
GO

SET LANGUAGE Italian

CREATE TABLE MyTable
(
ID int
IDENTITY(1,1)
PRIMARY KEY,
Data varchar(30)
)

INSERT INTO MyTable(Data) VALUES('21/03/2008 10.26.57')
INSERT INTO MyTable(Data) VALUES('22/03/2008 11.26.57')
INSERT INTO MyTable(Data) VALUES('1/03/2008 12.26.57')
INSERT INTO MyTable(Data) VALUES('4/04/2008 13.26.57')

-- Aggiungo un campo
ALTER TABLE MyTable
ADD New_Data datetime

UPDATE MyTable
SET New_Data=CAST(REPLACE(Data,'.',':') AS datetime)

-- Risultati
SELECT * FROM MyTable

-- Pulizia
DROP TABLE MyTable

--
Simone Viganò AKA VeroToad - MVP Windows Desktop Experience
My blog: http://blogs.dotnethell.it/VeroToad
My profile:
http://mvp.support.microsoft.com/default.aspx/profile/simone.vigano

0 new messages