我希望转换这样的字符串:20160520191959550
- 这实际上是2016-05-20 19:19:59
的日期时间。
我尝试在SQL语句中使用CAST as datetime
但是出现了这个错误:
从字符串转换日期和/或时间时转换失败。
这是SQL:
Select Cast(vbon.DATE_INS As datetime) As DINS
From vbon
我经常在没有分隔符的日期字符串上使用CAST
,我正在寻找类似的解决方案。是否有一种简单的方法可以完成工作而无需恢复LEFT
,RIGHT
和SUBSTRING
?
答案 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格式的字符串并使用CAST
或CONVERT
:
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), ':','')