我有一个查询语句,其中有一个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)'
我有一个查询语句,其中有一个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)'
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小时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分钟
希望这可以帮助到您!
我不确定这些是最好的选择,但它们肯定能完成任务:
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 : */
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öblerSelect 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对于需要将分钟转换为超过24小时格式的人:
DECLARE @minutes int = 7830
SELECT CAST(@minutes / 60 AS VARCHAR(8)) + ':' + FORMAT(@minutes % 60, 'D2') AS [Time]
结果:
130:30
我觉得这段代码能够正常工作:
SELECT FORMAT(@mins / 60 * 100 + @mins % 60, '#:0#')
感谢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
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
select convert(varchar(5),dateadd(mi,DATEDIFF(minute, FirstDate,LastDate),'00:00'),114)
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