将SQL中的整数转换为时间

5
我有一个数据库,其中时间以整数形式显示。但我想将其输出到正确格式的报告中。这是我想要更改的格式:
例如:
- 183000 将变成 18:30 - 500 将变成 00:05 - 160000 将变成 16:00
等等。
我已经尝试使用 CAST 和 CONVERT,但没有成功地将时间转换为正确的格式。
7个回答

4
假设您输入的始终是一个整数,您可以使用以下方式进行解析:
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等)。


3

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

hh:mm


+1,不需要字符串解析(这可能是我会做的事情)。 - Conrad Frix

2

首先将时间转换为4位数字的varchar字段,并在需要时添加前导零(例如500将变为0500),然后使用字符串连接函数将字段拆分为 Left(myfield,2) + ':' + right(myfield,2)。

每次运行报告时都执行此操作是一件愚蠢的事情,会浪费服务器资源。如果可能的话,请将该字段更改为varchar并运行代码一次。如果不可能,您可以添加一个格式化字段,并让触发器在插入时进行格式化(您仍然需要第一次更新该字段)。可能约束条件会比触发器更好,但这取决于数据库。


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

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))

3
虽然您的回答可能解决了问题,但包括说明如何以及为什么这样解决问题将有助于提高您帖子的质量,并可能导致更多的赞。请记住,您是在回答未来的读者问题,而不仅仅是现在提问的人。您可以编辑您的回答以添加说明,并指出适用的限制和假设。-来自评论 - Adam Marshall

0
ALTER FUNCTION [dbo].[MinutesToDuration]
(
    @minutes int 
)
RETURNS nvarchar(30)

AS
BEGIN
declare @hours  nvarchar(20)
DECLARE @XX NVARCHAR(10) 
DECLARE @HH  VARCHAR(2)
DECLARE @TT  VARCHAR(2)
DECLARE @BL   NVARCHAR(2)
DECLARE @TM  VARCHAR(5)

SET @XX=@minutes
IF @XX<60
    BEGIN
    IF @XX<10
        BEGIN
        SET @HH='00'
        SET @TT='0'+@XX
        END
    ELSE
        BEGIN
        SET @HH='00'
        SET @TT=@XX
        END
END
ELSE
BEGIN
    IF @XX%60=0
    BEGIN
    SET @HH=@XX/60
    SET @TT='00'
    END
    ELSE
        BEGIN
            SET @BL= @XX%60
            IF @BL<10
                BEGIN
                SET @HH=@XX/60
                SET @TT='0'+@BL
                END     
            ELSE
                BEGIN
                SET @HH=@XX/60
                SET @TT=@BL
                END
        END
END

SET @hours= @HH+':'+@TT

return @hours
END

2
你的回答可以通过添加更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接