2016-09-21 94 views
2

在此上看到一些線程,但我有一個特定的實例,我試圖在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

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

回答

0

我想你一定要創建臨時表 然後插入將所有記錄存入臨時表 重命名臨時表和原表

+1

是什麼讓你覺得呢? – scsimon

+0

1-創建臨時表2 - 將原始表中的所有記錄插入並轉換爲溫度表3 - 重命名臨時表和原始表 – Abouzar

6

您可以標準化日期格式。類似這樣的:

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; 
2

按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