Cómo convertir número de minutos a formato hh: mm en TSQL?


Tengo una consulta select que tiene DURATION columna para calcular el número de minutos . Quiero convertir esos minutos al formato hh:mm.

La duración tiene valores como 60, 120,150

Por ejemplo:

60 se convierte en 01:00 horas

120 se convierte en 02:00 horas

150 se convierte en 02:30 horas

También, así es como recupero DURACIÓN (Minutes)

DATEDIFF(minute, FirstDate,LastDate) as 'Duration (Minutes)'
Author: DineshDB, 2013-07-19

8 answers

Puede convertir la duración a una fecha y luego formatearla:

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

Para menos precisión, modifique el tamaño del varchar:

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

/* Results: 02:30 */
 43
Author: 8kb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-18 21:03:08

Esta función es convertir la duración en minutos a formato legible de horas y minutos. es decir, 2h30m. Elimina las horas si la duración es inferior a una hora, y muestra solo las horas si la duración en horas sin minutos adicionales.

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

Para usar esta función:

SELECT dbo.MinutesToDuration(23)

Resultados: 23m

SELECT dbo.MinutesToDuration(120)

Resultados: 2h

SELECT dbo.MinutesToDuration(147)

Resultados: 2h27m

Espero que esto ayude!

 9
Author: A Ghazal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-10 07:58:54

No estoy seguro de que estas sean las mejores opciones, pero definitivamente harán el trabajo:

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
 7
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-18 21:03:22
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 : */
 4
Author: dominik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 18:06:57

Gracias a un Ghazal, justo lo que necesitaba. Aquí hay una versión ligeramente limpia de su respuesta:

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
 1
Author: Arnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 11:37:03
<code>
    CREATE function dbo.minutesToHHMM(
        @minutes int
    )
    RETURNS varchar(10)
    as
    begin
        declare @hours int 
        set @hours = (@minutes / 60)
        return format(@hours, '   0') + 'h' + format (@minutes - @hours * 60, '00') + 'm'
    end
</code>

EJ: select minutesToHHMM (1441) devuelve 24h1m

 1
Author: Jean-François,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-20 02:32:16

Haría lo siguiente (copiar y pegar todo el material de abajo en ventana inmediata / ventana de consulta y ejecutar)

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 almacena el valor que generas en tu pregunta. El" truco " viene para entonces:
creamos una variable smalldatetime (en mi caso es formato yyyy.mm.dd) y la incrementamos con su valor int, luego mostramos (o almacenamos si lo desea) solo la parte time.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-18 21:10:53
select convert(varchar(5),dateadd(mi,DATEDIFF(minute, FirstDate,LastDate),'00:00'),114)    
 0
Author: Naveed Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-14 08:36:15