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

时间:2018-02-27 08:42:54

标签: sql sql-server datetime converter

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

20180227105954636241

select CONVERT(datetime, '20180227105954636241', 120)
  

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

3 个答案:

答案 0 :(得分:2)

根据您的问题,我建议使用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)

答案 1 :(得分:1)

您无法直接将这些带图案的字符串转换为datetime,并且我没有看到CONVERT函数用于此目的。您可以将下面的字符串格式化为cast它:

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

答案 2 :(得分:0)

您可以使用STUFF功能插入必要的冒号,句号和短划线。 STUFF有4个参数。首先是字符串填充字符,第二个是字符串中的位置,第三个是要删除的字符数(在本例中总是0),第四个是要插入的字符。

填充后,这会导致字符串26个字符长,但转换为datetime只接受23个字符。你必须取这个值的LEFT 23,切断字符串的最后3个字符以转换为datetime数据类型。

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)