【发布时间】:2020-07-07 01:00:19
【问题描述】:
我有一个表,当前所有列都存储为 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.
有什么想法吗?谢谢!
【问题讨论】:
-
使用 ISO 日期并忘记这些问题。他们采用 标准 格式 YYYY-MM-DD。
-
正如我在回答中警告的那样,@TheImpaler、
yyyy-MM-dd在 SQL Server 中并不安全。例如,在我的实例上,CONVERT(datetime, '2020-03-26')将失败。
标签: sql sql-server tsql sqldatatypes