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 秒ずれており、値が増えるとさらに悪化し、大規模なデータセットで実際に数十分を失うことになります。

2つの選択肢のうちの1つに置き換えることを考えていましたが、どちらがより効率的に使用できるかわかりませんか?

分割のあるもの:

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

またはキャスト付きの 2 つ (int オーバーランを 68 年まで防ぐため):

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

1 に答える 1

1

2 つのクエリの間には、実際には大きな違いはありません。整数演算は浮動小数点数よりわずかに高速であると言えます。そのため、SECONDS によるレポートが許容される場合は、浮動小数点数を優先できます。

于 2012-09-30T03:20:40.393 に答える