13

我需要将毫秒值 85605304.3587 转换为 0d 18h 21m 之类的值。不知道如何开始,是否有类似于 SQL 中的 TimeSpan 的东西,就像 C# 中的一样?

4

3 回答 3

24

您可以明确地进行计算。我觉得是这样的:

select floor(msvalue / (1000 * 60 * 60 * 24)) as days,
       floor(msvalue / (1000 * 60 * 60)) % 24 as hours,
       floor(msvalue / (1000 * 60)) % 60 as minutes

注意:一些数据库使用mod而不是%.

于 2017-07-17T14:31:36.747 回答
2

在 MS SQL SERVER 中,您可以使用下一个代码:

with cte as (
    select cast(85605304.3587 as int) / 1000 / 60 as [min]
), cte2 as (
    select 
        cast([min] % 60 as varchar(max)) as minutes,
        cast(([min] / 60) % 24 as varchar(max)) as hours,
        cast([min] / (60 * 24) as varchar(max)) as days
    from cte
)
select concat(days, 'd ', hours, 'h ', minutes, 'm') as tm
from cte2
于 2017-07-17T14:38:49.763 回答
1

使用本机日期和时间函数,也许:

SELECT
    AsDateTime = DATEADD(MILLISECOND, 85605304, 0)
  , AsDateTime2 = DATEADD(NANOSECOND, 7 * 100, DATEADD(MICROSECOND, 358, DATEADD(MILLISECOND, 85605304, CONVERT(datetime2, CONVERT(datetime, 0)))))
-- Incorrect datetime2 approach I initially did, has some precision loss, probably due to datetime's millisecond issue with 0's, 3's, and 7.'s
--SELECT DontDoThis = DATEADD(NANOSECOND, 7 * 100, DATEADD(MICROSECOND, 358, CONVERT(datetime2, DATEADD(MILLISECOND, 85605304, 0))))

datetime仅涵盖超过秒数的 3 位数,而datetime2将保持 7 位数。也许存在其他提供类似日期的对象的方式,我不知道。

于 2017-07-17T14:50:00.127 回答