SQL将int转换为时间

时间:2010-09-15 14:56:45

标签: sql time int

我有一个数据库,显示时间为整数。但是,我想将其输出到具有正确格式的报告中。这是我想要改变的格式:

例如。

183000将成为18:30 500将成为00:05 160000将成为16:00

等等。

我看过CAST和CONVERT,但没有成功设法以正确的格式获得这个时间。

6 个答案:

答案 0 :(得分:3)

看起来你需要除以100得到秒,除以10000得到分钟,除以1000000得到小时,然后将这些值格式化为字符串,在小时和分钟之间插入冒号,如

  

HH:MM

答案 1 :(得分:3)

假设您的输入始终为int,您可以使用以下内容进行解析:

DECLARE @stringTime varchar(6)

SET @stringTime =  RIGHT('000000' + CAST(intTime AS VARCHAR), 6)

SELECT CAST(LEFT(@stringTime, 2) + ':' + RIGHT(LEFT(@stringTime, 4), 2) AS TIME) as TimeValue

我绝对希望将此字段更改为实际时间或日期时间字段,因为不建议使用此级别的转换,尤其是对于使用频繁的数据库。确实有一种更好的存储数据的方法。

使用int值这种方式允许大量不良数据,而不会在输入上添加大量额外的检查和/或约束(即:260000,127900等)

答案 2 :(得分:2)

首先转换为varchar字段并将所有时间转换为4位数,如果需要则添加前导零(500将变为0500),然后使用concantenation分离字段Left(myfield,2)+':'+ right(myfield) ,2)

每次运行报表时这都是愚蠢的事情,浪费了服务器资源。如果可能,将字段更改为varchar并将代码更改为一次。如果不可能,你可以添加一个格式化的字段并在触发时进行格式化(你还需要第一次更新字段吗?可能是一个约束而不是一个触发器,但这取决于数据库

答案 3 :(得分:1)

我假设您使用CONVERT和以前的问题在SQL Server上。

您也可以使用DATEADD

WITH Times AS
(
SELECT 183000 AS T 
UNION ALL 
SELECT 500 
UNION ALL  
SELECT 160000 

)
SELECT CAST(DATEADD(SECOND, T%100 + (60*(T%10000 / 100)) + 3600*(T/10000),0)
            AS time /*Or datetime if < SQL Server 2008*/)
FROM Times

答案 4 :(得分:0)

declare @i int = 235959

select cast(stuff(stuff(
                case when len(cast(@i as varchar(6))) = 6 then cast(@i as varchar(6)) 
                     else REPLICATE('0',6 - LEN(cast(@i as varchar(6))))+cast(@i as varchar(6)) 
                end
            ,3,0,':'), 6, 0,':') as datetime)

set @i = 500

select cast(stuff(stuff(
                case when len(cast(@i as varchar(6))) = 6 then cast(@i as varchar(6)) 
                     else REPLICATE('0',6 - LEN(cast(@i as varchar(6))))+cast(@i as varchar(6)) 
                end
            ,3,0,':'), 6, 0,':') as datetime)

答案 5 :(得分:0)

DECLARE @intTime int
SET @intTime = 50000
SELECT CAST(STUFF(STUFF(CONCAT(REPLICATE('0', 6 - LEN(@intTime)),@intTime),3,0,':'),6,0,':') AS TIME(0))