我有一个表,当前所有列都存储为nvarchar(max),所以我正在将所有数据类型转换为应有的数据类型。我有一列日期,但是当我运行它时:
ALTER TABLE Leavers ALTER COLUMN [Actual_Termination_Date] date;
我知道
"Conversion failed when converting date and/or time from character string".
这是相对正常的,所以我做了以下调查:
SELECT DISTINCT TOP 20 [Actual_Termination_Date]
FROM LEAVERS
WHERE ISDATE([Actual_Termination_Date]) = 0
返回:
NULL
13/04/2017
14/04/2017
17/04/2017
19/04/2017
21/04/2017
23/04/2017
24/04/2017
26/04/2017
28/04/2017
29/03/2017
29/04/2017
30/04/2017
31/03/2017
42795
42797
42813
42817
42820
42825
null和excel样式的日期格式(例如42795)没有问题,但是这是我遇到的完全正常的日期。我通常通过使用以下修复程序之一来解决此类问题:
SELECT cast([Actual_Termination_Date] - 2 as datetime)
FROM LEAVERS
WHERE ISDATE([Actual_Termination_Date]) = 0
或
SELECT cast(convert(nvarchar,[Actual_Termination_Date], 103) - 2 as datetime)
FROM LEAVERS
WHERE ISDATE([Actual_Termination_Date]) = 0
[当它们像我将要返回的那样返回日期时,我将执行UPDATE语句以更改表中的日期,然后转换列类型。但是,我不断收到一条错误消息,告诉我无法转换各种日期,例如:
Conversion failed when converting the nvarchar value '21/04/2017' to data type int.
有什么想法吗?谢谢!
可能是由于您的语言设置。为了使'21/04/2017'
正常工作,您需要使用BRITISH
语言或其他使用dd/MM/yyyy
的语言。我可疑您正在使用实际上是美国人的ENGLISH
。
[American's use MM/dd/yyyy
的意思是'21/04/2017'
表示2017年第21个月的第4天;显然这是行不通的。
best方法将使用明确的格式,而不考虑语言和数据类型。对于yyyyMMdd
和yyyy-MM-ddThh:mm:ss.nnnnnnn
的SQL Server(在使用较早的yyyy-MM-dd
和yyyy-MM-dd hh:mm:ss.nnnnnnn
数据类型时,在SQL Server中[datetime
和smalldatetime
是not明确的)。
否则,您可以将CONVERT
与style代码一起使用:
SELECT CONVERT(date,'21/04/2017', 103)
将列设置为规范格式first,然后转换:
update leavers
set Actual_Termination_Date = try_convert(date, [Actual_Termination_Date], 103);
ALTER TABLE Leavers ALTER COLUMN [Actual_Termination_Date] date;
update
将执行从日期到字符串的隐式转换。 alter
应该能够“撤消”该隐式转换。
备份表,然后再执行此操作!您可能会发现某些日期无效–这在将日期存储为字符串时几乎是规则,尽管在少数情况下,所有日期字符串实际上都是一致的格式。
实际日期无所谓。当您尝试从字符串中减去2时发生错误:
[Actual_Termination_Date] - 2
线索来自错误消息:
Conversion failed when converting the nvarchar value '21/04/2017' **to data type int**.