我在SQL Server数据库中有一个表,其中包含日期字段,以yyyymmddhhnn
格式显示为varchar(其中nn
为分钟)。例如,200012011200
将是01 Dec 2000 12:00
。我需要将其转换为datetime
值,但convert
代码似乎都没有覆盖它。它最接近ISO格式yyyymmdd
,但不包括时间部分,因此调用convert(datetime, MyDateField, 112)
失败。
时间部分很重要,所以我不能把它剥掉。如何将此转换为日期时间?
答案 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。
我无法想象这个解决方案可能 任何丑陋而没有故意混淆它,我怀疑它非常有效,但确实有效。