1

我怎样才能将VARCHAR数据转换'20130120161643730'DATETIME

CONVERT(DATETIME, '20130120161643730')不起作用。

但是,CONVERT (DATETIME, '20130120 16:16:43:730')有效。我想它需要正确格式的数据。

有没有一种有效的方法可以用来DATETIME直接从未格式化的数据转换为?

我的解决方案是:

DECLARE @Var VARCHAR(100) = '20130120161643730'

SELECT CONCAT(LEFT(@Var,8),' ',SUBSTRING(@var,9,2),':',SUBSTRING(@var,11,2),':',SUBSTRING(@var,13,2),':',RIGHT(@Var,3))

它工作正常。但是,我正在寻找一个紧凑的解决方案。

4

3 回答 3

2

您可以通过不强制破折号并使用STUFF代替来使其更紧凑SUBSTRING

DECLARE @Var VARCHAR(100) = '20130120161643730';

SET @Var = LEFT(@Var, 8) + ' ' 
  + STUFF(STUFF(STUFF(RIGHT(@Var, 9),3,0,':'),6,0,':'),9,0,'.');

SELECT [string] = @Var, [datetime] = CONVERT(DATETIME, @Var);

结果:

string                  datetime
---------------------   -----------------------
20130120 16:16:43.730   2013-01-20 16:16:43.730
于 2013-08-07T13:57:04.843 回答
1
DECLARE @var VARCHAR(100) = '20130120161643730'
SELECT convert(datetime,(LEFT(@var,8)+' '+SUBSTRING(@var,9,2)+':'+SUBSTRING(@var,11,2)+':'+SUBSTRING(@var,13,2)+':'+RIGHT(@var,3)))

将这种类型的字符串转换为日期时间的唯一可能方法是将其断开,然后将其转换为 DateTime。此外,Concat 在 MS SQL 中不起作用,但在“+”中起作用。

于 2013-08-07T13:53:05.767 回答
0

假设这种格式是您经常使用的格式,更紧凑的方法是创建一个 UDF(用户定义的函数),将字符串解析为有效的日期时间。

所以类似于:

create function dbo.ParseDate (@var varchar(max)) returns datetime as
begin
  return (convert(datetime,(LEFT(@var,8)+' '+SUBSTRING(@var,9,2)+':'+SUBSTRING(@var,11,2)+':'+SUBSTRING(@var,13,2)+':'+RIGHT(@var,3))))
end

然后,您可以像这样从该函数中进行选择:

select dbo.ParseDate('20130120161643730')

因此,任何需要引用日期的代码都会更加紧凑。

于 2013-08-07T13:56:44.217 回答