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

Lea*_*ner 29 t-sql datediff type-conversion sql-server-2008

我有一个选择查询,其中包含DURATION用于计算分钟数的列.我想将这些分钟转换为hh:mm格式.

持续时间的值如 60, 120,150

例如:

60变为 01:00小时

120变为 02:00小时

150变成 02:30小时

另外,这是我检索DURATION(Minutes)的方法

DATEDIFF(minute, FirstDate,LastDate) as 'Duration (Minutes)'
Run Code Online (Sandbox Code Playgroud)

8kb*_*8kb 48

您可以将持续时间转换为日期,然后对其进行格式化:

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 */
Run Code Online (Sandbox Code Playgroud)

要求精度较低,请修改varchar的大小:

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

/* Results: 02:30 */
Run Code Online (Sandbox Code Playgroud)

  • 这不处理超过 23:59 的计数。如果您的计算产生类似于“102:00”小时的内容,那么这将错误地将“06:00”小时置于上下文中。 (5认同)

A G*_*zal 10

此功能是将持续时间(以分钟为单位)转换为可读小时和分钟格式.即2小时30分钟.如果持续时间少于一小时,它会消除小时数,如果没有额外分钟,则仅显示小时数.

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
Run Code Online (Sandbox Code Playgroud)

要使用此功能:

SELECT dbo.MinutesToDuration(23)
Run Code Online (Sandbox Code Playgroud)

结果:23米

SELECT dbo.MinutesToDuration(120)
Run Code Online (Sandbox Code Playgroud)

结果:2h

SELECT dbo.MinutesToDuration(147)
Run Code Online (Sandbox Code Playgroud)

结果:2 小时27分钟

希望这可以帮助!


boz*_*tko 8

对于需要将分钟转换为 24 小时以上格式的时间的人:

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

结果:

130:30
Run Code Online (Sandbox Code Playgroud)


Phi*_*lip 7

我不确定这些是最好的选择,但他们肯定会完成工作:

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
Run Code Online (Sandbox Code Playgroud)


小智 5

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 : */
Run Code Online (Sandbox Code Playgroud)