Comment convertir le nombre de minutes en HH:mm format en TSQL?
j'ai une requête select qui a la colonne DURATION
pour calculer le nombre de Minutes . Je veux convertir ces minutes au format hh:mm
.
Durée a des valeurs comme 60, 120,150
par exemple:
60 devient 01: 00 heures
120 devient 02 :00 heures
150 devient 02: 30 heures
aussi, c'est comme ça que je récupère la durée ( Minutes
)
DATEDIFF(minute, FirstDate,LastDate) as 'Duration (Minutes)'
8 réponses
vous pouvez convertir la durée à une date et ensuite le formater:
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 */
pour moins de précision, modifier la taille du varchar:
SELECT CONVERT(varchar(5),
DATEADD(minute, DATEDIFF(minute, @FirstDate, @LastDate), 0), 114)
/* Results: 02:30 */
cette fonction est de convertir la durée en minutes en heures lisibles et le format de minutes. I. e 2h30m. Il élimine les heures si la durée est inférieure à une heure, et affiche seulement les heures si la durée en heures sans minutes supplémentaires.
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
pour utiliser cette fonction:
SELECT dbo.MinutesToDuration(23)
Results: 23m
SELECT dbo.MinutesToDuration(120)
Results: 2h
SELECT dbo.MinutesToDuration(147)
Results: 2h27m
Espérons que cette aide!
Je ne suis pas sûr que ce soient les meilleures options, mais ils vont certainement faire le travail:
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
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 : */
grâce à un Ghazal, exactement ce dont j'avais besoin. Voici une version légèrement nettoyée de sa réponse:
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
<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>
EX: select minutesToHHMM (1441) returns 24h1m
je ferais ce qui suit (copier-coller tout le truc ci-dessous dans la fenêtre immédiate / fenêtre de requête et exécuter)
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
stocke la valeur que vous générez dans votre question. Le "truc" vient alors:
nous créons une variable smalldatetime
(dans mon cas c'est le format yyyy.mm.dd
) et l'incrémentons avec votre valeur int
, puis nous affichons (ou stockons si vous voulez) la partie time
seulement.
select convert(varchar(5),dateadd(mi,DATEDIFF(minute, FirstDate,LastDate),'00:00'),114)