SQL Server - 在ALTER TABLE中将VarChar转换为日期

问题描述:

在此上看到一些线程,但我有一个特定的实例,我试图在ALTER TABLE语句内执行转换。SQL Server - 在ALTER TABLE中将VarChar转换为日期

ALTER TABLE Leads 
ALTER COLUMN [Created Date] Date 

这是抛出一个错误:

Msg 241, Level 16, State 1, Line 34
Conversion failed when converting date and/or time from character string.
The statement has been terminated.

创建日期目前定为(varchar(max),NULL)

+0

什么做的值样子在那一栏。 – scsimon

+0

MM/DD/YYYY即10/24/2016 – hansolo

+0

该列是否包含任何作为值或任何其他字符串字符的空格? –

我想你一定要创建临时表 然后插入将所有记录存入临时表 重命名临时表和原表

+1

是什么让你觉得呢? – scsimon

+0

1-创建临时表2 - 将原始表中的所有记录插入并转换为温度表3 - 重命名临时表和原始表 – Abouzar

您可以标准化日期格式。类似这样的:

UPDATE Leads 
    SET [Created Date] = TRY_CONVERT(Date, [Created Date], 101); 

第三个参数是针对评论中提到的MM/DD/YYYY格式。这会将该值转换为日期 - 如果可以的话),否则转换为NULL。然后,SQL Server将使用其默认格式转换回字符串。

注意:如果您这样做,请务必备份表格,以免丢失列中的信息!

然后,你的代码应工作:

ALTER TABLE Leads ALTER COLUMN [Created Date] Date; 

你可以找到流氓值,通过使用:

select [Created Date] 
from Leads 
where try_convert(date, [Created Date], 101) is null and 
     [Created Date] is not null; 

按Jarlh:

ALTER TABLE Leads 
ADD COLUMN CreatedDate Date; 

UPDATE Leads 
SET CreatedDate = cast(right([Created Date],4) + '-' + left([Created Date],2) + '-' + left(right([Created Date],7),2) as Date); 

Alter TABLE Leads 
DROP COLUMN [Created Date]; 

sp_rename 'Leads.CreatedDate', '[Created Date]', 'COLUMN'; 
+0

这有一些严重的假设。如果价值是“1/1/2016”呢?如果价值有一个领先的空间呢?很显然,OP的专栏有错误......但即使这些例子也会用他的代码进行转换。 – scsimon

+0

@scsimon真的,我没有考虑过。 – JohnHC