2017-05-26 55 views
1

我在表中有一列存储分钟数,作为名为[course_access_minutes]numeric(18,4)字段。将分钟数转换为hh:mm

存储的数据来自黑板数据库,并期待这样的:

0.0500 
0.0667 
0.3667 
up to 
314.0833 
625.8167 

如何将这些时间HH:MM,我已经在数据库文档,良好的外观和所有我能找到是

course_access_minutes数字(18,4)这是用户在此登录会话期间总共访问此课程的分钟数。

我可以假设我可以直接从几分钟转换为几小时吗?我想我会将0以下的任何值作为0分钟。在SQL中执行此操作的最佳方法是什么?在此先感谢您的帮助。

+1

是从什么样的预期输出数据? –

+0

@Sean Lange样品数据如上,我想转换成hh:mm例如(48:35 48小时35分钟) – Dafmeister

+0

是的,那么0.0500转换成hh:mm会怎么样呢?什么将314.0833转换为hh:mm? –

回答

1

试试这个

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) 
+0

感谢你,这真的很干净!我已经使用了CONVERT(time(0),DATEADD(s,625.8167 * 60,0)),因为它是时间格式。 – Dafmeister

1

您可以使用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 

返回

hours 
0:0 
0:1 
0:30 
1:20 
5:14 
10:25 
+0

感谢您的帮助,这也有效,但已经去了一线的答案。 – Dafmeister

+3

@Dafmeister是的,但接受的答案是,你永远不会超过24小时 –

0
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