将分钟数转换为 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