我看到了一些关于这个问题的帖子,但我有一个具体的实例,我正在尝试在ALTER TABLE语句中进行转换。
ALTER TABLE Leads
ALTER COLUMN [Created Date] Date
出现了错误:
消息 241,级别 16,状态 1,行 34
将日期和/或时间从字符串转换时转换失败。
已终止该语句。
“创建日期”当前设置为(varchar(max),null)
我看到了一些关于这个问题的帖子,但我有一个具体的实例,我正在尝试在ALTER TABLE语句中进行转换。
ALTER TABLE Leads
ALTER COLUMN [Created Date] Date
出现了错误:
消息 241,级别 16,状态 1,行 34
将日期和/或时间从字符串转换时转换失败。
已终止该语句。
“创建日期”当前设置为(varchar(max),null)
你可以将日期格式标准化。像这样:
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';
我认为你必须创建临时表,然后将所有记录插入到临时表中,接着重命名临时表和原始表。
SELECT [Created Date] FROM Leads WHERE ISDATE([Created Date]) <> 1
,以查找这些错误值。 - S3S