t-SQL和DATEDIFF效率与精度

时间:2012-09-30 03:09:17

标签: sql sql-server tsql precision datediff

我有一个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

1 个答案:

答案 0 :(得分:1)

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