【问题标题】:Linking Excel to a time aggregate in SQL Server将 Excel 链接到 SQL Server 中的时间聚合
【发布时间】:2013-12-04 16:33:49
【问题描述】:

我有一个返回电话数据摘要的存储过程,其中一个摘要是总通话时长,可以从 1 到 100 小时不等。

当前返回 this 的代码是:

SELECT CAST(SUM(CAST(D.CallDuration AS FLOAT)) AS DATETIME) AS [Total Duration]
FROM MyTable D

这对于 24 小时以下的值返回 1900-01-01 02:59:21.997 值,对于超过 24 小时的值返回 1900-01-02 07:51:24.997,这是我所期望的。

我正在尝试使用 OLE 连接将其输入 Excel 仪表板,但当我这样做时,值 1900-01-01 02:59:21.997(在公式栏中可见)显示为 26:59:21 而不是 02:59:21

据我所知,这是因为 Excel 使用 00/01/1900 作为“时间”值,而 SQL Server 使用 01/01/1900

有没有办法让它正常显示为小时和分钟的时间值?我宁愿避免使用字符串,因为它必须在其他地方用作值。

【问题讨论】:

  • @pnuts 遗憾的是不,对于值 > 1 我需要显示总小时数(例如 26)
  • @pnuts 抱歉,我知道这很令人困惑,对于值 1900-01-02 07:51,我想显示 31:51。如果可能的话,我也不想使用新列。
  • 我本来建议去掉日期,只使用时间,但这听起来不是你想要的。这只留下了从 SQL 服务器输出无效日期或让 excel 以不同方式翻译日期的选项。对吗?
  • @pnuts 抱歉,是的,这给出了正确的值,但我真的想避免更多的列,我有几个列有同样的问题,它会给用户增加很多(希望是不必要的)复杂性,如果可能的话,我宁愿在服务器上完成所有艰苦的工作/意大利面条代码。

标签: sql sql-server excel sql-server-2008


【解决方案1】:

您需要从日期中减去 1(或 2)

Excel 的值基于 12/31/1899 为 0,但 SQL Server 使用 1/1/1900 作为纪元 (0) 日期

还要注意,由于 1900 年 2 月 29 日的错误,如果您起床那么远,则需要从日期减去 2(即 1440 小时或 60 天)

SELECT [Total Duration] =
    case when SUM(CAST(D.CallDuration AS FLOAT)) > 60
         then CAST(SUM(CAST(D.CallDuration AS FLOAT)) AS DATETIME) -2
         else CAST(SUM(CAST(D.CallDuration AS FLOAT)) AS DATETIME) -1
         end
FROM MyTable D

更简单的解决方案:

Select SUM(CAST(D.CallDuration AS FLOAT)) as [Total Duration]

将此值格式化为 [h]:mm 应该会显示正确的时间,并且您不必担心历元或闰年错误

【讨论】:

  • 这不太行,SQL 查询返回 1899-12-31 02:59:21 但 Excel 将其显示为 00:00:00
  • 我添加了一种利用 excel 使用数字表示日期的方式。无需转换。
  • 第二个解决方案完美运行,给我02:59:21 不到 24 小时,1900-01-01 02:59:21 超过 24 小时。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2013-10-08
  • 2010-09-26
  • 1970-01-01
  • 2014-01-23
相关资源
最近更新 更多