Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将毫秒转换为天、小时、分钟_Sql_Sql Server_Tsql_Sql Server 2017 - Fatal编程技术网

SQL将毫秒转换为天、小时、分钟

SQL将毫秒转换为天、小时、分钟,sql,sql-server,tsql,sql-server-2017,Sql,Sql Server,Tsql,Sql Server 2017,我需要将一个毫秒值85605304.3587转换为一个类似0d 18h 21m的值。 不知道如何开始,SQL中是否有类似于C#中的TimeSpan的东西?您可以显式地进行计算。我认为是: select floor(msvalue / (1000 * 60 * 60 * 24)) as days, floor(msvalue / (1000 * 60 * 60)) % 24 as hours, floor(msvalue / (1000 * 60)) % 60 as m

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

您可以显式地进行计算。我认为是:

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
而不是
%

在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
使用本机,可能:


datetime
只覆盖秒以外的3位数字,而
datetime2
将保留7位数字。也许还有其他类似日期的对象存在,我不知道。

您使用哪种方法?博士后?神谕标准SQL中的数据类型(即
SQL
标记所指的)将是
interval
SQL 2017是我正在使用的。没有名为“SQL 2017”的标准,但我猜您的意思是“SQL Server 2017”
TimeSpan
相当于
time
,但它只存储一天中的时间,而不是持续时间。这意味着您不能指定大于24小时的时间<代码>时间跨度可以直接存储到
时间
字段中此值来自何处?它的范围是多少?为什么不直接将其存储到
时间
字段中?第3行中的第一个括号使其无法命名。
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))))