2

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

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

4

3 回答 3

6

尝试这个

declare @t varchar(20)
set @t='200012011200'
select cast(stuff(stuff(@t, 11,0,':'),9,0,' ') as datetime)
于 2013-09-11T08:32:35.440 回答
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)
于 2013-09-11T09:00:07.593 回答
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 的小时数,但需要intdateadd.

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

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

如果不故意混淆它,我无法想象这个解决方案会变得更丑陋,我怀疑它非常有效,但它确实有效。

于 2013-09-11T08:45:09.160 回答