4

我有一列abc varchar(100)包含类似的数据2011-09-26 16:36:57.810000

我想将此列转换为DATETIME...

但是做一个

Convert(DATETIME, abc,120) 

给出这个错误:

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

任何人都可以帮我将我的varchar格式转换为datetimeSQL Server 2008 吗?

提前致谢

4

5 回答 5

8

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

declare @abc varchar(100)='2011-09-26 16:36:57.810' 
select convert(datetime,@abc,121)

因此,您可以通过将 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)

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

于 2013-09-26T10:09:32.493 回答
5

如果您需要 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
于 2016-08-09T06:17:28.790 回答
0

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

Convert(DATETIME, SUBSTRING(abc, 0, 24) ,120) 
于 2013-09-26T10:13:31.927 回答
0

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

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

我想出了使用CAST运算符的解决方案:

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
于 2020-04-07T16:54:10.137 回答
0

根据GBrian的回答,我想出了:

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

我还没有对它如何与基于子字符串的解决方案进行基准测试。

于 2017-03-14T14:19:24.747 回答