我有一列abc varchar(100)
包含类似的数据2011-09-26 16:36:57.810000
我想将此列转换为DATETIME
...
但是做一个
Convert(DATETIME, abc,120)
给出这个错误:
从字符串转换日期和/或时间时转换失败。
任何人都可以帮我将我的varchar
格式转换为datetime
SQL Server 2008 吗?
提前致谢
我有一列abc varchar(100)
包含类似的数据2011-09-26 16:36:57.810000
我想将此列转换为DATETIME
...
但是做一个
Convert(DATETIME, abc,120)
给出这个错误:
从字符串转换日期和/或时间时转换失败。
任何人都可以帮我将我的varchar
格式转换为datetime
SQL Server 2008 吗?
提前致谢
您可以使用样式 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)
尽量避免将日期存储为字符串。
如果您需要 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
SQL Server 仅支持毫秒的小数点后 3 位,因此以下将起作用:
Convert(DATETIME, SUBSTRING(abc, 0, 24) ,120)
假设我们有以下字符串变量:
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
根据GBrian的回答,我想出了:
CONVERT(DATETIME, CONVERT(DATETIME2, abc, 126))
我还没有对它如何与基于子字符串的解决方案进行基准测试。