如何使用 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)
如何将此字符串转换为日期时间
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)