次のように説明できる 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