Подтвердить что ты не робот

Как преобразовать число минут в формат hh: mm в TSQL?

У меня есть запрос на выбор, который имеет столбец DURATION для подсчета количества минут. Я хочу преобразовать эти минуты в формат hh:mm.

Длительность имеет значения как 60, 120,150

Например:

60 становится 01:00 часов

120 становится 02:00 часов

150 становится 02:30 часов

Кроме того, это как я получаю DURATION (Minutes)

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

Ответ 1

Вы можете преобразовать продолжительность в дату и затем отформатировать ее:

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 */

Ответ 2

Эта функция предназначена для преобразования продолжительности в минутах в формат читаемых часов и минут. т.е. 2h30m. Он устраняет часы, если продолжительность составляет менее одного часа, и показывает только часы, если продолжительность в часах без дополнительных минут.

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)

Результаты: 23 м

SELECT dbo.MinutesToDuration(120)

Результаты: 2h

SELECT dbo.MinutesToDuration(147)

Результаты: 2h27m

Надеюсь, это поможет!

Ответ 3

Я не уверен, что это лучшие варианты, но они определенно проделают свою работу:

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

Ответ 4

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 : */

Ответ 5

Спасибо Газалу, только то, что мне нужно. Здесь немного очищенная версия его (ее) ответа:

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

-- Based on http://stackoverflow.com/questions/17733616/how-to-convert-number-of-minutes-to-hhmm-format-in-tsql

AS

BEGIN

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

end

Ответ 6

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

Ответ 7

Я бы сделал следующее (скопируйте все содержимое ниже в окно окна/окна запроса и выполните)

DECLARE @foo int
DECLARE @unclefoo smalldatetime
SET @foo = DATEDIFF(minute, CAST('2013.01.01 00:00:00' AS datetime),CAST('2013.01.01 00:03:59' AS datetime)) -- AS 'Duration (Minutes)'

SET @unclefoo = DATEADD(minute, @foo, '2000.01.01')

SELECT CAST(@unclefoo AS time)

@foo хранит значение, которое вы генерируете в своем вопросе. К этому моменту приходит "трюк":
мы создаем переменную smalldatetime (в моем случае это формат yyyy.mm.dd) и увеличиваем ее с помощью значения int, а затем показываем (или сохраняем, если хотите) часть time.

Ответ 8

declare function dbo.minutes2hours (
    @minutes int
)
RETURNS varchar(10)
as
begin
    return format(dateadd(minute,@minutes,'00:00:00'), N'HH\:mm','FR-fr')
end

Ответ 9

В случае, если кто-то заинтересован в получении результатов как 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