2017-05-26 52 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