将varchar转换为sql中具有毫秒的datetime

将varchar转换为sql中具有毫秒的datetime,sql,sql-server-2008,Sql,Sql Server 2008,我有一个列,abc varchar(100),数据如下2011-09-26 16:36:57.810000 我想将此列转换为DATETIME 但是做一个 Convert(DATETIME, abc,120) 正在给出此错误: 从字符串转换日期和/或时间时,转换失败 有谁能帮我将SQL Server 2008中的varchar格式转换为datetime 提前感谢您可以使用样式121,但毫秒只能有3位(即yyyy-mm-dd-hh:mi:ss.mmm(24h))格式 因此,您可以通过将varch

我有一个列,
abc varchar(100)
,数据如下
2011-09-26 16:36:57.810000

我想将此列转换为
DATETIME

但是做一个

Convert(DATETIME, abc,120) 
正在给出此错误:

从字符串转换日期和/或时间时,转换失败

有谁能帮我将SQL Server 2008中的
varchar
格式转换为
datetime


提前感谢

您可以使用样式121,但毫秒只能有3位(即
yyyy-mm-dd-hh:mi:ss.mmm(24h)
)格式

因此,您可以通过将varchar字段限制为23个字符,然后再转换为:

declare @abc varchar(100)='2011-09-26 16:36:57.810000' 
select convert(datetime,convert(varchar(23),@abc),121)
或者使用
Left()
函数获取前23个字符,如下所示:

select convert(datetime,left(@abc,23),121)

尽量避免将日期存储为字符串。

SQL Server仅支持毫秒小数点后3位,因此以下操作将起作用:

Convert(DATETIME, SUBSTRING(abc, 0, 24) ,120) 

如果您需要6位精度,请使用
DATETIME2

SELECT CONVERT(DATETIME2, '2016-08-09T08:08:50.358000', 126) as MSSQLDateTime2
SELECT CONVERT(DATETIME, '2016-08-09T08:08:50.358', 126) as MSSQLDateTime

根据GBrian的回答,我得出:

CONVERT(DATETIME, CONVERT(DATETIME2, abc, 126))

我还没有将其与基于子字符串的解决方案进行比较。

假设我们有以下字符串变量:

DECLARE @d VARCHAR(100)  = '2020-04-06T04:35:07.9490051Z' -- 7 digits nanoseconds
DECLARE @d1 VARCHAR(100) = '2020-04-05T15:00:00Z'         -- simple: without nanoseconds
我使用运算符得出了解决方案:

SELECT CAST(LEFT(@d,19) + 'Z' AS DATETIME)  -- outputs: 2020-04-06 04:35:07.000
SELECT CAST(LEFT(@d1,19) + 'Z' AS DATETIME) -- outputs: 2020-04-05 15:00:00.000

字符串
2011-09-26 16:36:57.810000
无法转换为日期时间。毫秒只能有0-999。但是我如何才能将此列转换为日期时间,然后再转换为任何其他方式我已经有了以6位mellisec.形式给出的用户数据,因此我认为我需要拆分最后3位数字?是的,在转换之前,您必须确保毫秒只有3位数字。我已经更新了我的答案。您还应该注意日期时间类型的精度-例如,将正确保留.997,但强制转换.998或.999之类的值将导致该值四舍五入到最接近的秒。对不起,请操作。Datetime2可从SQL Server 2008 R2获得
SELECT CAST(LEFT(@d,19) + 'Z' AS DATETIME)  -- outputs: 2020-04-06 04:35:07.000
SELECT CAST(LEFT(@d1,19) + 'Z' AS DATETIME) -- outputs: 2020-04-05 15:00:00.000