2010-06-08 85 views
1

我有一个专门声明为int(称为HourMil)的列,它将时间存储在military format中。我需要这个值转换为字符串格式化(HH:MM)将军事时间转换为字符串表示

例如

HourMil = 710 -> must be 07:10 
HourMil = 1305 -> must be 13:05 

其实我使用此代码(与工作正常)的列HourMil转换为字符串表示。

SELECT SUBSTRING(LEFT('0',4-LEN(CAST(HourMil AS VARCHAR)))+CAST(HourMil AS VARCHAR),1,2)+':'+SUBSTRING(LEFT('0',4-LEN(CAST(HourMil AS VARCHAR)))+CAST(HourMil AS VARCHAR),3,2) FROM MYTABLE 

但我认为这个代码可以改进。

+0

什么版本的SQL Server? – 2010-06-08 22:11:12

+0

事实上,这种“军事”格式(24小时制)是世界上绝大多数人使用的 - “除美国外的所有人”,为什么不把它称为“国际”或“标准“ 时间 ?? – 2010-06-09 05:10:23

回答

1

通过创建一个日期,然后将其格式化:

SELECT SUBSTRING(CONVERT(nvarchar, DATEADD 
    (hh, HourMil/100, DATEADD(mi, HourMil % 100, '1900-01-01')), 8), 0, 6) 
+0

+1非常好的解决方案,非常感谢。 – RRUZ 2010-06-08 22:26:12

0

方程:

H = HourMil/100; 
M = HourMil - (HourMil/100) * 100; 

工作的例子:

H = 710/100 = 7 
M = 710 - (710/100) * 100 = 10 

H = 1305/100 = 13 
M = 1305 - (1305/100) * 100 = 5 

注:所有/*运营商MUST下只有小数工作。 (整数)

那么你的SQL将是:

CONCAT(CAST(H AS VARCHAR(8)), ':', CAST(M AS VARCHAR(8))); 

等式最终似乎是:

CONCAT(CAST((HourMil/100) AS VARCHAR(8)), ':', CAST((HourMil - (HourMil/100) * 100) AS VARCHAR(8))); 
0

这是另一种方法,也是最短的一种

select stuff(right('0'+ltrim(hourmail),4),3,0,':') from 
(
select 710 as hourmail union all 
select 1305 
) as t 
相关问题