为什么SQL Server不让我将'21 / 04/17'存储为日期?

问题描述 投票:0回答:3

我有一个表,当前所有列都存储为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.

有什么想法吗?谢谢!

sql sql-server database tsql ssms
3个回答
1
投票

可能是由于您的语言设置。为了使'21/04/2017'正常工作,您需要使用BRITISH语言或其他使用dd/MM/yyyy的语言。我可疑您正在使用实际上是美国人的ENGLISH

[American's use MM/dd/yyyy的意思是'21/04/2017'表示2017年第21个月的第4天;显然这是行不通的。

best方法将使用明确的格式,而不考虑语言和数据类型。对于yyyyMMddyyyy-MM-ddThh:mm:ss.nnnnnnn的SQL Server(在使用较早的yyyy-MM-ddyyyy-MM-dd hh:mm:ss.nnnnnnn数据类型时,在SQL Server中[datetimesmalldatetimenot明确的)。

否则,您可以将CONVERTstyle代码一起使用:

SELECT CONVERT(date,'21/04/2017', 103)

0
投票

将列设置为规范格式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应该能够“撤消”该隐式转换。

备份表,然后再执行此操作!您可能会发现某些日期无效–这在将日期存储为字符串时几乎是规则,尽管在少数情况下,所有日期字符串实际上都是一致的格式。


0
投票

实际日期无所谓。当您尝试从字符串中减去2时发生错误:

[Actual_Termination_Date] - 2

线索来自错误消息:

Conversion failed when converting the nvarchar value '21/04/2017' **to data type int**.
© www.soinside.com 2019 - 2024. All rights reserved.