0

我有一个 SQL Server 2008 表,可以这样说明:

CREATE TABLE tbl (dtIn DATETIME2, dtOut DATETIME2)
INSERT tbl VALUES
('9/12/2012 3:21:22 AM', '9/12/2012 3:32:15 AM'),
('9/12/2012 3:58:52 AM', '9/12/2012 4:00:47 AM'),
('9/12/2012 4:02:00 AM', '9/12/2012 4:03:26 AM'),
('9/12/2012 4:04:34 AM', '9/12/2012 4:17:03 AM'),
('9/12/2012 4:22:37 AM', '9/12/2012 4:24:18 AM'),
('9/12/2012 5:35:27 AM', '9/12/2012 5:36:26 AM'),
('9/12/2012 5:37:00 AM', '9/12/2012 5:38:08 AM'),
('9/12/2012 5:38:36 AM', '9/12/2012 5:39:40 AM'),
('9/12/2012 5:44:22 AM', '9/12/2012 9:40:21 PM'),
('9/12/2012 9:41:28 PM', '9/12/2012 9:44:19 PM'),
('9/12/2012 10:25:40 PM', '9/12/2012 10:30:25 PM'),
('9/12/2012 10:30:40 PM', '9/12/2012 10:34:06 PM'),
('9/12/2012 10:37:53 PM', '9/12/2012 10:40:12 PM'),
('9/12/2012 10:40:17 PM', '9/12/2012 11:59:59 PM')   --and so on

然后我需要执行这样的查询(以分钟为单位计算持续时间):

WITH ctx AS(
  SELECT datediff(minute, dtIn, dtOut) AS d FROM tbl
  )
SELECT SUM(d) FROM ctx

上面查询的问题是我失去了精度。例如,对上表的查询将延迟 1 秒,对于更多的值,这会变得更糟,以至于我实际上会为大型数据集损失数十分钟。

我正在考虑用两种替代方法之一来替换它,但我不确定哪一种更有效?

一分法:

WITH ctx AS(
  SELECT datediff(second, dtIn, dtOut) / 60.0 AS d FROM tbl
  )
SELECT SUM(d) FROM ctx

或两个与演员(以防止长达 68 年的 int 溢出):

WITH ctx AS(
  SELECT datediff(second, dtIn, dtOut) AS d FROM tbl
  )
SELECT SUM(CAST(d AS BIGINT)) FROM ctx
4

1 回答 1

1

在您的两个查询之间,确实没有太大区别。可以说整数数学比浮点数略快,因此如果可以接受 SECONDS 报告,您可能更喜欢后者。

于 2012-09-30T03:20:40.393 回答