将分钟数转换为 hh:mm
Convert number of minutes to hh:mm
我在 table 中有一列将分钟数存储为名为 [course_access_minutes]
的 numeric(18,4)
字段。
存储的值来自黑板数据库,如下所示:
0.0500
0.0667
0.3667
up to
314.0833
625.8167
如何将它们转换为时间 hh:mm,我仔细查看了数据库文档,但我能找到的只有
course_access_minutes numeric(18,4) 这是用户在此登录会话期间访问此课程的总分钟数。
我可以假设我可以将分钟直接转换为小时吗?我想我会将任何低于 1 的值视为 0 分钟。在 SQL 中执行此操作的最佳方法是什么?预先感谢您的帮助。
你可以这样使用FLOOR
DECLARE @SampleData AS TABLE
(
Minutes numeric(18,4)
)
INSERT INTO @SampleData
VALUES
( 0.0500),
( 1.0500),
( 30.0500),
( 80.0500),
( 314.0833),
( 625.8167)
SELECT CONCAT(floor(sd.Minutes/60),':', CASE WHEN sd.Minutes - floor(sd.Minutes/60)*60 < 1 THEN '0'
ELSE FLOOR(sd.Minutes - floor(sd.Minutes/60)*60 )
END) AS hours
FROM @SampleData sd
Returns
hours
0:0
0:1
0:30
1:20
5:14
10:25
试试这个
SELECT CONVERT(varchar, DATEADD(s, 625.8167 * 60, 0), 108)
如果持续时间超过 24 小时,您可以使用此
SELECT CONVERT(varchar, CAST(1877.4501 * 60 AS int) / 3600)
+ RIGHT(CONVERT(varchar, DATEADD(s, 1877.4501 * 60, 0), 108), 6)
WITH _Samples AS (
SELECT CONVERT(numeric(18, 4), 0.0500) [course_access_minutes]
UNION ALL SELECT 0.0667
UNION ALL SELECT 0.3667
UNION ALL SELECT 314.0833
UNION ALL SELECT 625.8167
)
SELECT
S.course_access_minutes,
-- split out the number
FLOOR(S.course_access_minutes / 60) [hours],
FLOOR(S.course_access_minutes % 60) [minutes],
FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60) [seconds],
-- to a string
CONVERT(varchar(10), FLOOR(S.course_access_minutes / 60))
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR(S.course_access_minutes % 60)), 2)
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)), 2) [time_string],
-- You could consider converting to the time data type if the values will never exceed the limit
-- time supports 00:00:00.0000000 through 23:59:59.9999999
-- 0 through 1439.9833333 ... 23 * 60 = 1380 + 59 = 1439 + (59 / 60) = 1439.9833333
-- (see: https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql)
CONVERT(time,
CONVERT(varchar(10), FLOOR(S.course_access_minutes / 60))
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR(S.course_access_minutes % 60)), 2)
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)), 2)
) [time]
FROM
_Samples S
(进一步推进这个想法并拆分小数秒并不困难。)
产生:
course_access_minutes hours minutes seconds time_string time
---------------------- ------ -------- -------- ------------ ----------------
0.0500 0 0 3 0:00:03 00:00:03.0000000
0.0667 0 0 4 0:00:04 00:00:04.0000000
0.3667 0 0 22 0:00:22 00:00:22.0000000
314.0833 5 14 4 5:14:04 05:14:04.0000000
625.8167 10 25 49 10:25:49 10:25:49.0000000
请注意,这将类似于 Greg 的回答,但我想对其进行解释和简化。
您有分钟数,因此将它们除以 60 并将其取整(去掉小数点)得到小时数(不包括分钟数)。
如果您再次计算总分钟数,并删除(mod 它)底线小时数 - 这需要乘以 60 转换为分钟数 - 剩下的分钟数基本上只是找出带走那么多组花花公子还剩下什么:
SELECT FLOOR(course_access_minutes / 60) as Hours,
(FLOOR(course_access_minutes) % 60) as Minutes
FROM MyTable
如果您希望分钟分数的数量出现小数(您希望秒以小数形式出现),请删除 FLOOR
。
如果您想要实数的秒数,请保留 FLOOR
并使用 Greg 所拥有的:FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)
秒数。但是要小心括号,因为你可能会不小心将小数点后的分钟取整并得到 0,然后 0*60 就是零:
FLOOR(
(
course_access_minutes -
FLOOR(course_access_minutes)
) * 60
) as Seconds
我在 table 中有一列将分钟数存储为名为 [course_access_minutes]
的 numeric(18,4)
字段。
存储的值来自黑板数据库,如下所示:
0.0500
0.0667
0.3667
up to
314.0833
625.8167
如何将它们转换为时间 hh:mm,我仔细查看了数据库文档,但我能找到的只有
course_access_minutes numeric(18,4) 这是用户在此登录会话期间访问此课程的总分钟数。
我可以假设我可以将分钟直接转换为小时吗?我想我会将任何低于 1 的值视为 0 分钟。在 SQL 中执行此操作的最佳方法是什么?预先感谢您的帮助。
你可以这样使用FLOOR
DECLARE @SampleData AS TABLE
(
Minutes numeric(18,4)
)
INSERT INTO @SampleData
VALUES
( 0.0500),
( 1.0500),
( 30.0500),
( 80.0500),
( 314.0833),
( 625.8167)
SELECT CONCAT(floor(sd.Minutes/60),':', CASE WHEN sd.Minutes - floor(sd.Minutes/60)*60 < 1 THEN '0'
ELSE FLOOR(sd.Minutes - floor(sd.Minutes/60)*60 )
END) AS hours
FROM @SampleData sd
Returns
hours
0:0
0:1
0:30
1:20
5:14
10:25
试试这个
SELECT CONVERT(varchar, DATEADD(s, 625.8167 * 60, 0), 108)
如果持续时间超过 24 小时,您可以使用此
SELECT CONVERT(varchar, CAST(1877.4501 * 60 AS int) / 3600)
+ RIGHT(CONVERT(varchar, DATEADD(s, 1877.4501 * 60, 0), 108), 6)
WITH _Samples AS (
SELECT CONVERT(numeric(18, 4), 0.0500) [course_access_minutes]
UNION ALL SELECT 0.0667
UNION ALL SELECT 0.3667
UNION ALL SELECT 314.0833
UNION ALL SELECT 625.8167
)
SELECT
S.course_access_minutes,
-- split out the number
FLOOR(S.course_access_minutes / 60) [hours],
FLOOR(S.course_access_minutes % 60) [minutes],
FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60) [seconds],
-- to a string
CONVERT(varchar(10), FLOOR(S.course_access_minutes / 60))
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR(S.course_access_minutes % 60)), 2)
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)), 2) [time_string],
-- You could consider converting to the time data type if the values will never exceed the limit
-- time supports 00:00:00.0000000 through 23:59:59.9999999
-- 0 through 1439.9833333 ... 23 * 60 = 1380 + 59 = 1439 + (59 / 60) = 1439.9833333
-- (see: https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql)
CONVERT(time,
CONVERT(varchar(10), FLOOR(S.course_access_minutes / 60))
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR(S.course_access_minutes % 60)), 2)
+ ':' + RIGHT('00' + CONVERT(varchar(10), FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)), 2)
) [time]
FROM
_Samples S
(进一步推进这个想法并拆分小数秒并不困难。)
产生:
course_access_minutes hours minutes seconds time_string time
---------------------- ------ -------- -------- ------------ ----------------
0.0500 0 0 3 0:00:03 00:00:03.0000000
0.0667 0 0 4 0:00:04 00:00:04.0000000
0.3667 0 0 22 0:00:22 00:00:22.0000000
314.0833 5 14 4 5:14:04 05:14:04.0000000
625.8167 10 25 49 10:25:49 10:25:49.0000000
请注意,这将类似于 Greg 的回答,但我想对其进行解释和简化。
您有分钟数,因此将它们除以 60 并将其取整(去掉小数点)得到小时数(不包括分钟数)。
如果您再次计算总分钟数,并删除(mod 它)底线小时数 - 这需要乘以 60 转换为分钟数 - 剩下的分钟数基本上只是找出带走那么多组花花公子还剩下什么:
SELECT FLOOR(course_access_minutes / 60) as Hours,
(FLOOR(course_access_minutes) % 60) as Minutes
FROM MyTable
如果您希望分钟分数的数量出现小数(您希望秒以小数形式出现),请删除 FLOOR
。
如果您想要实数的秒数,请保留 FLOOR
并使用 Greg 所拥有的:FLOOR((S.course_access_minutes - FLOOR(S.course_access_minutes)) * 60)
秒数。但是要小心括号,因为你可能会不小心将小数点后的分钟取整并得到 0,然后 0*60 就是零:
FLOOR(
(
course_access_minutes -
FLOOR(course_access_minutes)
) * 60
) as Seconds