2016-05-30 62 views
3

我期待转换一个像这样的字符串:20160520191959550 - 实际上这是2016-05-20 19:19:59的日期时间。如何将日期时间字符串在SQL Server中不带分隔符作为日期时间转换?

我想在一个SQL语句中使用CAST as datetime,但得到这个错误:

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

这里是SQL:

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

我经常使用的日期字符串CAST无定界符并正在寻找类似的解决方案。有没有一种简单的方法来完成工作,而不会回到LEFTRIGHTSUBSTRING

+0

输入字符串或者一些数值? – Mukund

+0

对于给您造成的不便,我表示歉意,我省略了我正在使用MS-SQL 2008.谢谢大家的及时回复。 –

+0

@BernardFaucher Devart和我的答案将在SQL Server 2008中工作 – gofr1

回答

3
SELECT CAST(
    STUFF(
     STUFF(
      STUFF(
       STUFF('20160520191959550', 9, 0, ' ') 
      , 12, 0, ':') 
     , 15, 0, ':') 
    , 18, 0, '.') AS DATETIME) 
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)); 
+0

'DATETIMEFROMPARTS'也可用于SQL Server 2012 :) –

+0

谢谢,@ M.Ali。我不得不停止信任我的记忆关于这样的事情:-) –

+0

@DanGuzman +1的解决方案,尽管OP不寻找子串等。 – RhysO

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

3

Addtional变种已经发布:

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

有趣的解决方案2012+ – Devart

+0

是的,只有自2012年以来,但OP还没有指定版本,所以我决定这样的变体应该在这里) – Vasily

0

I thi nk convert会为你工作。我现在无法测试,但我已经用日期完成了你要查找的内容。这里是一个很好的文章: http://www.sqlusa.com/bestpractices/datetimeconversion/

+0

谢谢。但是,在发布我的问题之前,我已经看到了特定的页面。 –

0

你可以试试这个:

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

编号:Convert DateTime to yyyyMMddHHmm in T-SQL

+0

谢谢。不过,我期待将varchar转换为日期时间格式,而不是相反。 –

相关问题