如何使用 sql 将字符串转换为不带分隔符的日期时间?

How to convert string to datetime without seperator using sql?

如何将此字符串转换为日期时间

20180227105954636241

select CONVERT(datetime, '20180227105954636241', 120)

Conversion failed when converting date and/or time from character string.

根据你的问题,我可以建议使用 SUBSTRING 方法并解析 NVARCHAR 值,然后将其转换为 DATETIME。

DECLARE @date NVARCHAR(MAX) = '20180227105954636241'

DECLARE @year NVARCHAR(4) = SUBSTRING(@date,0,5)
DECLARE @month NVARCHAR(2) = SUBSTRING(@date,5,2)
DECLARE @day NVARCHAR(2) = SUBSTRING(@date,7,2)
DECLARE @hours NVARCHAR(2) = SUBSTRING(@date,9,2)
DECLARE @minutes NVARCHAR(2) = SUBSTRING(@date,11,2)
DECLARE @seconds NVARCHAR(2) = SUBSTRING(@date,13,2)
DECLARE @milliseconds NVARCHAR(2) = SUBSTRING(@date,15,3)

SELECT CONVERT(DATETIME, (@Year + '-' + @month + '-' + @day + ' ' + @hours + ':' + @minutes + ':' + @seconds + '.' + @milliseconds), 120)

您不能将这些带图案的字符串直接转换为 datetime,而且我没有看到任何用于此目的的 CONVERT 函数。您可以像下面那样将字符串格式化为 cast it :

DECLARE @date VARCHAR(MAX) = '20180227105954636241'
DECLARE @date1 VARCHAR(30) 

set @date1 = SUBSTRING(@date,  1, 8) + ' ' +  -- this is datepart
             SUBSTRING(@date,  9, 2) + ':' +  -- this is hour
             SUBSTRING(@date, 11, 2) + ':' +  -- this is minute
             SUBSTRING(@date, 13, 2) + '.' +  -- this is second
             SUBSTRING(@date, 15, 6)          -- this is decimal of second

select cast(@date1 as datetime2(6))  -- 6 is the decimal point of second

输出

2018-02-27 10:59:54.636241

您可以使用 STUFF 函数插入必要的冒号、句点和破折号。 STUFF 有 4 个参数。第一个是要将字符填充到的字符串,第二个是字符串中的位置,第三个是要删除的字符数(在此示例中始终为 0),第四个是要插入的字符。

填充后,这会产生一个 26 个字符长的字符串,但转换为日期时间只接受 23 个字符。您必须取此值的 LEFT 23,切断字符串的最后 3 个字符以转换为日期时间数据类型。

DECLARE @temp varchar(100) = '20180227105954636241'
SELECT CONVERT(datetime, LEFT(STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(@temp, 15, 0, '.'), 13, 0, ':'), 11, 0, ':'), 9, 0, ' '), 7, 0, '-'), 5, 0, '-'), 23), 120)