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.
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
> 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