如何在SQL Server中将没有分隔符的datetime字符串转换为datetime?

时间:2016-05-30 11:25:28

标签: sql-server sql-server-2008 datetime

我希望转换这样的字符串:20160520191959550 - 这实际上是2016-05-20 19:19:59的日期时间。

我尝试在SQL语句中使用CAST as datetime但是出现了这个错误:

  

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

这是SQL:

Select Cast(vbon.DATE_INS As datetime) As DINS 
From vbon 

我经常在没有分隔符的日期字符串上使用CAST,我正在寻找类似的解决方案。是否有一种简单的方法可以完成工作而无需恢复LEFTRIGHTSUBSTRING

6 个答案:

答案 0 :(得分:4)

在SQL Server 2012及更高版本中,您可以使用DATETIMEFROMPARTS

DECLARE @DateTimeString varchar(19) = '20160520191959550';
SELECT DATETIMEFROMPARTS(
      SUBSTRING(@DateTimeString,1,4)
    , SUBSTRING(@DateTimeString,5,2)
    , SUBSTRING(@DateTimeString,7,2)
    , SUBSTRING(@DateTimeString,9,2)
    , SUBSTRING(@DateTimeString,11,2)
    , SUBSTRING(@DateTimeString,13,2)
    , SUBSTRING(@DateTimeString,15,3)
    );

在早期版本中,一种方法是构建ISO 8601格式的字符串并使用CASTCONVERT

SELECT CAST(
      SUBSTRING(@DateTimeString,1,4)
     + '-' + SUBSTRING(@DateTimeString,5,2)
     + '-' + SUBSTRING(@DateTimeString,7,2)
     + 'T' + SUBSTRING(@DateTimeString,9,2)
     + ':' + SUBSTRING(@DateTimeString,11,2)
     + ':' + SUBSTRING(@DateTimeString,13,2)
     + '.' + SUBSTRING(@DateTimeString,15,3)
    AS datetime2(3));

答案 1 :(得分:3)

SELECT CAST(
    STUFF(
        STUFF(
            STUFF(
                STUFF('20160520191959550', 9, 0, ' ')
            , 12, 0, ':')
        , 15, 0, ':')
    , 18, 0, '.') AS DATETIME)

答案 2 :(得分:3)

已发布的附加变体:

SELECT  CONVERT(DATETIME, FORMAT(CONVERT(BIGINT, '20160520191959550'),
                                 '####-##-## ##:##:##"."###'))

答案 3 :(得分:0)

我建议你创建功能:

CREATE FUNCTION dbo.datestringtodatetime
(
    -- Add the parameters for the function here
    @d NVARCHAR(max)
)
RETURNS datetime
AS
BEGIN
    -- Declare the return variable here
    DECLARE @table TABLE (
        id int,
        [pos] int,
        [sym] char(1)
    )

    DECLARE @output datetime
    --In this table we determine were to put delimeters
    INSERT INTO @table VALUES
    (1, 5,'-'),
    (2, 8,'-'),
    (3, 11,'T'),
    (4, 14,':'),
    (5, 17,':'),
    (6, 20,'.')

    ;WITH cte AS (
        SELECT STUFF(@d,t.[pos],0,t.[sym]) as d_, 1 as l
        FROM @table t
        WHERE t.id = 1
        UNION ALL
        SELECT STUFF(c1.d_,t.[pos],0,t.[sym]), l+1
        FROM cte c1
        INNER JOIN @table t
            ON t.id = l+1
    )

    SELECT @output = TRY_CAST(d_ as datetime)
    FROM cte
    WHERE l = 6
    -- Return the result of the function
    RETURN @output

END
GO

你可以这样称呼:

SELECT [dbo].[datestringtodatetime] ('20160520191959550')

输出:

2016-05-20 19:19:59.550

如果传递错误的值,您将获得NULL

答案 4 :(得分:0)

我认为转换对你有用。我现在无法测试,但我已经完成了你想要的日期。这是一篇好文章: http://www.sqlusa.com/bestpractices/datetimeconversion/

答案 5 :(得分:0)

你可以试试这个:

SELECT CONVERT(VARCHAR(8), vbon.DATE_INS, 112) + REPLACE(CONVERT(varchar, vbon.DATE_INS, 108), ':','')

参考:Convert DateTime to yyyyMMddHHmm in T-SQL