如何在TSQL中将分钟数转换为hh:mm格式?

44

我有一个查询语句,其中有一个DURATION列来计算分钟数。我想将这些分钟转换为hh:mm格式。

Duration的值如60, 120,150

例如:

60成为 01:00小时

120成为 02:00小时

150成为 02:30小时

此外,这就是我检索DURATION (Minutes)的方式

DATEDIFF(minute, FirstDate,LastDate) as 'Duration (Minutes)'

会不会出现持续时间超过24小时的情况? - George Mastros
我在这里找到了一个很棒的答案。 - Nabaraj Ghimire
13个回答

69
你可以将持续时间转换为日期,然后进行格式化:
DECLARE
    @FirstDate datetime,
    @LastDate datetime

SELECT
    @FirstDate = '2000-01-01 09:00:00',
    @LastDate = '2000-01-01 11:30:00'

SELECT CONVERT(varchar(12), 
       DATEADD(minute, DATEDIFF(minute, @FirstDate, @LastDate), 0), 114) 

/* Results: 02:30:00:000 */

为了降低精度,请修改varchar的大小:

SELECT CONVERT(varchar(5), 
       DATEADD(minute, DATEDIFF(minute, @FirstDate, @LastDate), 0), 114) 

/* Results: 02:30 */

1
太棒了,较低的精度选项完美地运行了。第一个和最后一个日期已经是日期时间格式化的。所以我只需要最后两行。 - Learner
这很棒,对解决我的问题也有帮助,但是需要提醒一下,它不能处理负差值。 SELECT CONVERT(varchar(5), DATEADD(minute, -90, 0), 114) 我输入了-90,它给出的结果是22:30,而不是“-1:30”。 - Ads
我也遇到了负时间的问题。这里的解决方案可以解决它:标题为“简单转换” `CASE WHEN RPAYCODE.TIMEINSECONDS < 0 THEN '-' ELSE '' END -- 符号
  • CONVERT(varchar, DATEADD(s, ABS(RPAYCODE.TIMEINSECONDS), 0), 108) -- hh:mm:ss` @Ads
- Mike S.
小心,如果你想要精确到高精度(比如12),你需要将“DateDiff”更改为“毫秒”(或适当的差异),因为内部函数返回一个整数。 - David Rogers
8
不能处理超过“23:59”的计数。如果有一个计算产生了类似于“102:00”小时的东西,那么这个程序将错误地把“06:00”小时作为上下文。 - MikeTeeVee

24

这个函数是将分钟表示的时间转换为易于阅读的小时和分钟格式,例如2小时30分钟。如果持续时间少于1小时,则会省略小时部分,如果持续时间为整数小时且没有额外的分钟,则仅显示小时部分。

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

AS
BEGIN
declare @hours  nvarchar(20)

SET @hours = 
    CASE WHEN @minutes >= 60 THEN
        (SELECT CAST((@minutes / 60) AS VARCHAR(2)) + 'h' +  
                CASE WHEN (@minutes % 60) > 0 THEN
                    CAST((@minutes % 60) AS VARCHAR(2)) + 'm'
                ELSE
                    ''
                END)
    ELSE 
        CAST((@minutes % 60) AS VARCHAR(2)) + 'm'
    END

return @hours
END

使用此功能:

SELECT dbo.MinutesToDuration(23)

结果: 23m

SELECT dbo.MinutesToDuration(120)

结果:2小时

SELECT dbo.MinutesToDuration(147)

结果:2小时27分钟

希望这可以帮助到您!


你如何计算天数? - Jephren Naicker

11

我不确定这些是最好的选择,但它们肯定能完成任务:

declare @durations table
(
    Duration int
)

Insert into @durations(Duration)
values(60),(80),(90),(150),(180),(1000)

--Option 1 - Manually concatenate the values together
select right('0' + convert(varchar,Duration / 60),2) + ':' + right('0' + convert(varchar,Duration % 60),2)
from @Durations

--Option 2 - Make use of the time variable available since SQL Server 2008
select left(convert(time,DATEADD(minute,Duration,0)),5)
from @durations

GO

8
DECLARE @Duration int

SET @Duration= 12540 /* for example big hour amount in minutes -> 209h */

SELECT CAST( CAST((@Duration) AS int) / 60 AS varchar) + ':'  + right('0' + CAST(CAST((@Duration) AS int) % 60 AS varchar(2)),2)

/* you will get hours and minutes divided by : */

1
小时部分前导零:right('0' + CAST( CAST((@Duration) AS int) / 60 AS varchar),2) + ':' + right('0' + CAST(CAST((@Duration) AS int) % 60 AS varchar(2)),2) - Bernhard Döbler
1
处理负数值: Select Case When @Duration<0 And @Duration>-60 Then '-' else '' End + CAST(@Duration/60 as varchar) + ':' + right('0' + CAST(Abs(@Duration) % 60 as varchar(2)),2) - navigator
如果您的 @Duration 使用了精度,则在转换为 Int 之前应先转换为 Decimal(10,0)。这样做将会四舍五入您的数字。否则,像 58.9 这样的值将被截断为 0:58(而不是 0:59),而 59.9 将被截断为 0:59(而不是 1:00)。这完全取决于您的需求。我使用第三方应用程序处理数学时遇到了一些问题,所以我经常得到像 4.9999999500000 这样的结果,我希望能够四舍五入。 - MikeTeeVee

6

对于需要将分钟转换为超过24小时格式的人:

DECLARE @minutes int = 7830
SELECT CAST(@minutes / 60 AS VARCHAR(8)) + ':' + FORMAT(@minutes % 60, 'D2') AS [Time]

结果:

130:30

4

我觉得这段代码能够正常工作:

SELECT FORMAT(@mins / 60 * 100 + @mins % 60, '#:0#')


2

感谢A Ghazal,这正是我需要的。以下是他(她)回答的稍微整理过的版本:

create FUNCTION [dbo].[fnMinutesToDuration]
(
    @minutes int 
)
RETURNS nvarchar(30)

-- Based on https://dev59.com/fGMm5IYBdhLWcg3wRdbe

AS

BEGIN

return rtrim(isnull(cast(nullif((@minutes / 60)
                                , 0
                               ) as varchar
                        ) + 'h '
                    ,''
                   )
            + isnull(CAST(nullif((@minutes % 60)
                                 ,0
                                ) AS VARCHAR(2)
                         ) + 'm'
                     ,''
                    )
            )

end

1
如果有人想要将60转换为01:00小时,将120转换为02:00小时,将150转换为02:30小时,那么这个函数可能会有所帮助:
    create FUNCTION [dbo].[MinutesToHHMM]
(
    @minutes int 
)
RETURNS varchar(30)
AS

BEGIN
declare @h int
        set @h= @minutes / 60
        declare @mins varchar(2)
        set @mins= iif(@minutes%60<10,concat('0',cast((@minutes % 60) as varchar(2))),cast((@minutes % 60) as varchar(2)))
return iif(@h <10, concat('0', cast(@h as varchar(5)),':',@mins)
        ,concat(cast(@h as varchar(5)),':',@mins))

end

1
select convert(varchar(5),dateadd(mi,DATEDIFF(minute, FirstDate,LastDate),'00:00'),114)    

0
如果你想要一个XX天YY小时和ZZ分钟的表示方法,只需要尝试:
SELECT
    CAST(f.TimeAmount / 1440 AS VARCHAR(8)) + 'd ' +
    CAST((f.TimeAmount % 1440) / 60 AS VARCHAR(8)) + 'h ' +
    FORMAT(f.TimeAmount % 60, 'D2') + 'min' AS [TIME_TEXT]
FROM
    MyTable f

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