【问题标题】:Difference in minutes from datetime与日期时间的分钟差
【发布时间】:2015-02-24 04:43:36
【问题描述】:

我正在尝试从两个时间戳列(日期时间)获取总时差

我目前有一个 表 1 设置,如下所示:

  • Time_Line_Down => 日期时间
  • Time_Line_Ran => 日期时间
  • Total_Downtime => 带有公式的计算列:

    (当 [Time_Line_Down] 为 NULL 然后为 NULL else CONVERT([varchar],case when [Time_Line_Ran] IS NULL then NULL else [Time_Line_Ran]-[Time_Line_Down] end,(108)) end)

每次出现某些情况时,我都会将这三列(我有更多列,但问题出在这一列)复制到另一个 表 2 中,最初设置如下:

  • Time_Line_Down => 日期时间
  • Time_Line_Ran => 日期时间
  • Total_Downtime => 日期时间

然后我使用 Excel 电子表格从 SQL Server“获取外部数据”并使用数据透视表处理数据。

示例

  • Time_Line_Down = 2015-02-20 12:32:40.000
  • Time_Line_Ran = 2015-02-20 12:34:40.000
  • Total_Downtime = 1900-01-01 00:02:00.000

期望的输出

我希望数据透视表能够为我提供该表中所有行的停机时间总计

假设累计停机时间是四十五小时五十分钟三十秒,它应该读作 (45:50:30)

问题:

即使我将 excel 数据透视表中的 Total_Downtime 列格式化为 h:mm:ss 以读取如下:

  • Total_Downtime = 0:02:00

随着行数的累积和总计的计算,时间戳的“日期”部分出现混乱,结果是总数超过 24 小时

我的尝试

我将表2中Total_Downtime列的数据类型格式更改为time(0),这样它就不会发送“Date”部分,只发送“Time”部分时间戳,它正在工作并读出 00:02:00

但是现在我的数据透视表中该列的所有值都是 0:00:00,无论 SQL 表中实际存在什么值。

有什么建议吗?

【问题讨论】:

  • 我不会将您的数据类型更改为时间。几乎不可能确定两者跨越日期障碍的时间。你只有 3 个你关心的数据部分,首先做一个 datediff 几个小时,然后一个 datediff for minutes mod 60 得到分钟,最后一个 datediff seconds mod 60 得到秒。应该很简单。

标签: sql sql-server excel


【解决方案1】:

您可以使用 Excel 时间格式[h]:mm:ss,它可以超过 24 小时。

或者,您可以使用 SQL 函数 DATEDIFF 以秒为单位获取总停机时间,然后将其转换为您需要在 Excel 中显示的时间,例如

case when [Time_Line_Down] IS NULL then NULL else case when [Time_Line_Ran] IS NULL then NULL else datediff(ss, Time_Line_Ran, Time_Line_Down) end end

我认为你不需要这里的CASE 语句,你可以使用

datediff(ss, Time_Line_Ran, Time_Line_Down)

【讨论】:

  • 感谢您的快速响应,更改 excel 中的时间格式并没有给出我预期的结果,因为现在显示的值如 5774:11:47 .. 我假设是由于“日期”部分。我目前正在使用你和 Sean Lange 推荐的 SQL 函数 DATEDIFF 进行测试,我会让你知道结果。你是对的,如果主要由于我的应用程序导致 Time_Line_Ran 和 Time_Line_Down 列中缺少时间戳,case 语句只是不计算 Total_Downtime。
【解决方案2】:

感谢大家的帮助,

我按照建议尝试了函数 DATEDIFF,我将 Table 1 计算列公式和 Table 2 Total_Downtime 列数据类型更改为 int。一旦导入到 excel 中,这个数值需要一些额外的计算。

原则上是最好的答案,应该适用于任何试图计算两个时间戳之间的差异的人,如前所述,非常简单。

但在我的情况下,我需要维护两件事:

1) 表1中Total_Downtime列的格式00:00:00,使用DATEDIFF时改为整数值

2)excel中的数据透视表Total_Downtime列格式[h]:mm:ss(TobyLL建议),需要多次计算才能从秒转换

解决方案

得知每次我从 表 1 复制到 表 2 时,计算值(例如 00:02:00)都会更改为 1900-01-01 00: 02:00.000 并且当导入 Excel 时它等于 1.001388889,我决定强制时间戳的“日期”部分为 1899-12-31,以便 Excel 仅计算数据透视表中的总计与“时间”(十进制)部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多