我在表格中有一个列,用于存储名为str(predict)
的{{1}}字段的分钟数。
存储的值来自黑板数据库,如下所示:
numeric(18,4)
如何将这些转换为时间hh:mm,我已经很好地查看了数据库文档,我能找到的就是
course_access_minutes numeric(18,4)这是用户在此登录会话期间完全访问此课程的分钟数。
我可以假设我可以从几分钟到几小时直接转换吗?我想我会将低于1的任何值作为0分钟。在SQL中执行此操作的最佳方法是什么?在此先感谢您的帮助。
答案 0 :(得分:2)
试试这个
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)
答案 1 :(得分: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
答案 2 :(得分:1)
请注意,这就像格雷格的答案,但我想解释和简化它。
您有分钟数,因此将它们除以60并对其进行下限(除去小数点)将得出小时数(无分钟数)。
如果您再次计算总分钟数,并移除(修改)固定小时数-这需要将乘以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
答案 3 :(得分: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