我有一个选择查询,其中有
DURATION
列来计算分钟数。我想将这些分钟转换为 hh:mm
格式。
持续时间的值类似于
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 分。如果持续时间少于一小时,它会消除小时;如果持续时间以小时为单位,没有额外的分钟,则仅显示小时。
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
对于那些需要将分钟转换为超过 24 小时格式的时间的人:
DECLARE @minutes int = 7830
SELECT CAST(@minutes / 60 AS VARCHAR(8)) + ':' + FORMAT(@minutes % 60, 'D2') AS [Time]
结果:
130:30
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 : */
这似乎对我有用:
SELECT FORMAT(@mins / 60 * 100 + @mins % 60, '#:0#')
感谢 A Ghazal,这正是我所需要的。 这是他(她)的答案的稍微清理过的版本:
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
select convert(varchar(5),dateadd(mi,DATEDIFF(minute, FirstDate,LastDate),'00:00'),114)
如果有人有兴趣获得以下结果 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
我会执行以下操作(将下面的全部内容复制粘贴到立即窗口/查询窗口中并执行)
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
部分。
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
如何在sql server中获取不同的第一个和最后一个记录时间....
....
Select EmployeeId,EmployeeName,AttendenceDate,MIN(Intime) as Intime ,MAX(OutTime) as OutTime,
DATEDIFF(MINUTE, MIN(Intime), MAX(OutTime)) as TotalWorkingHours
FROM ViewAttendenceReport WHERE AttendenceDate >='1/20/2020 12:00:00 AM' AND AttendenceDate <='1/20/2020 23:59:59 PM'
GROUP BY EmployeeId,EmployeeName,AttendenceDate;
如果您想要 XX 天 YY 小时和 ZZ 分钟的符号,只需尝试:
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
声明@TimeFormat nvarchar(20),@分钟 BIGINT 设置@分钟=125
设置@TimeFormat =
案例@分钟 >= 60 那么(选择
CAST 时的情况((@分钟 / 60) AS VARCHAR(2))<10 THEN '0' + CAST((@minutes / 60) AS VARCHAR(2)) ELSE CAST((@minutes / 60) AS VARCHAR(2)) END
+ ':' +
案例 (@分钟 % 60) > 0
然后 CAST 时的情况((@分钟 % 60) AS VARCHAR(2))<10 THEN '0'+CAST((@minutes % 60) AS VARCHAR(2)) ELSE CAST((@minutes % 60) AS VARCHAR(2)) END
ELSE '00'
END)
ELSE CASE WHEN CAST((@minutes % 60) AS VARCHAR(2))<10 THEN '00:0'+CAST((@minutes % 60) AS VARCHAR(2)) ELSE '00:'+CAST((@minutes % 60) AS VARCHAR(2)) END
END
select @TimeFormat