Sql 将nvarchar列类型更改为datetime

Sql 将nvarchar列类型更改为datetime,sql,sql-server,Sql,Sql Server,columnWithDate是nvarchar(255)的一种类型,数据采用2018.06.19.格式。我检查了所有不同的值,columnWithDate中有一行的值为NULL 我在alter命令中运行时遇到以下错误: ALTER TABLE table_name ALTER COLUMN columnWithDate datetime; 这里缺少什么?列中的某个位置的值不正确。我建议找到它: The conversion of a nvarchar data type to a dateti

columnWithDate是nvarchar(255)的一种类型,数据采用
2018.06.19.
格式。我检查了所有不同的值,columnWithDate中有一行的值为NULL

我在alter命令中运行时遇到以下错误:

ALTER TABLE table_name
ALTER COLUMN columnWithDate datetime;

这里缺少什么?

列中的某个位置的值不正确。我建议找到它:

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value.
如果要删除不正确的日期,请首先更新:

select columnWithDate
from table_name
where try_convert(datetime, columnWithDate) is null and
      columnWithDate is not null;
这会将值转换回字符串,但在您的系统上,字符串应该可以转换回日期时间,我怀疑日期后的额外点(.)是罪魁祸首。在您的示例中
2018.06.19.

下面这段代码给了我同样的错误

update table_name
    set columnWithDate = try_convert(datetime, columnWithDate);
Msg 242,16级,状态3,第3行nvarchar数据的转换 类型转换为日期时间数据类型导致值超出范围


因此,只需在更改之前从nvarchar字段中删除点。

您需要首先将值更改为明确的格式,然后更改数据类型。对于您的值,只需删除
,因为这将生成ISO格式
yyyyMMdd

DECLARE @DATE NVARCHAR(255)= N'2018.06.19.'

SELECT CAST(@DATE AS datetime)

不过,正如我所评论的,
date
可能是一个更好的选择,因为您的值中没有时间部分。

值“2018.06.19.”不是有效的日期时间字符串。它有一个尾随期,这是一个问题。但真正的问题是,您很可能有一些值不是实际日期,如2月30日或6月31日。@SeanLange“2018.06.19”确实会转换为日期时间。。在OP中选择try_convert(datetime,'2018.06.19')@JohnCappelletti,它的周期在19“2018.06.19”之后。@SeanLange我有吗?或者这只是不好的突出显示?@johncapelletti我只能假设他们突出显示的值就是表中的值。清晰的样本数据如此重要的另一个原因。使用他们突出显示的数据实际上会导致他们发布错误消息。加1表示看到尾随时间段。如果datetime字符串中没有毫秒,这是可行的。公平地说,我假设OP只有一个日期,甚至没有时间@johncapelletti的小时部分(因此添加了关于使用
date
而不是
datetime
)。当然,我只有一个样本作为假设的基础:/感谢您对尾随期的完整建议。你说得对,我在那个专栏里没有时间部分。我有另一个专栏,其中有这些时间部分,只是每个实例都是
2018-06-19 00:00:00.000
格式,没有实时部分值。我可以把这个日期时间转换成日期吗?谢谢你的建议!正如其他人指出的那样,我的专栏在日期末尾有一个尾随句号。这就是问题所在。
UPDATE YourTable
SET YourDateColumn = REPLACE(YourDateColumn,'.','');

ALTER TABLE YourTable ALTER COLUMN YourDateColumn datetime; --Should this not be a date?