将格式为yyyymmddhhnn的字符串转换为datetime

时间:2013-09-11 08:26:57

标签: sql sql-server datetime

我在SQL Server数据库中有一个表,其中包含日期字段,以yyyymmddhhnn格式显示为varchar(其中nn为分钟)。例如,200012011200将是01 Dec 2000 12:00。我需要将其转换为datetime值,但convert代码似乎都没有覆盖它。它最接近ISO格式yyyymmdd,但不包括时间部分,因此调用convert(datetime, MyDateField, 112)失败。

时间部分很重要,所以我不能把它剥掉。如何将此转换为日期时间?

3 个答案:

答案 0 :(得分:6)

试试这个

declare @t varchar(20)
set @t='200012011200'
select cast(stuff(stuff(@t, 11,0,':'),9,0,' ') as datetime)

答案 1 :(得分:1)

SELECT convert(varchar, cast(SUBSTRING('200012011200',1,4)+
'-'+SUBSTRING('200012011200',5,2)+
'-'+SUBSTRING('200012011200',7,2)+
' '+SUBSTRING('200012011200',9,2)+
':'+SUBSTRING('200012011200',11,2)+
':00'+
'.000' AS DATETIME), 109)

这将导致Dec 1 2000 12:00:00:000PM

使用112作为参数将产生20001201

享受

更新:

convert(varchar...)仅用于演示目的。 您也可以使用它:

SELECT CAST(SUBSTRING('200012011200',1,4)+
'-'+SUBSTRING('200012011200',5,2)+
'-'+SUBSTRING('200012011200',7,2)+
' '+SUBSTRING('200012011200',9,2)+
':'+SUBSTRING('200012011200',11,2)+
':00'+
'.000' AS DATETIME)

答案 2 :(得分:0)

我自己相当强硬的解决方案:

dateadd(mi, cast(substring(MyDateTime, 11, 2) as int), dateadd(hh, cast(substring(MyDateTime, 9, 2) as int), convert(datetime, left(MyDateTime, 8), 112)))

一个可怕的装置,但它完成了这项工作。从内到下分解:

convert(datetime, left(MyDateTime, 8), 112)

获取前8个字符(yyyymmdd)并转换为ISO格式。

dateadd(hh, cast(substring(MyDateTime, 9, 2) as int), ...)

使用dateadd - 字符9和10添加小时,但需要在int中使用之前投射dateadd

dateadd(mi, cast(substring(MyDateTime, 11, 2) as int), ...)

使用相同的方法添加分钟,字符11和12。

我无法想象这个解决方案可能 任何丑陋而没有故意混淆它,我怀疑它非常有效,但确实有效。