0
我具有可以被示出爲這樣的SQL Server 2008中的表:T-SQL和DATEDIFF效率與精度
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
謝謝。另外,不會在N條記錄(比如100,000條)上進行分割比將100,000條轉換爲BIGINT更慢? – c00000fd
從int(int32)到bigint的投射並不像你想象的那麼昂貴,所以是的,這也可以發揮偏好後者的作用。 – RichardTheKiwi
還有關於您的評論「由SECONDS報告是可以接受的」。它不是「可以接受的」,它是必不可少的!如果我不這樣做,我會失去精確度。這裏有一個例子:http://stackoverflow.com/questions/12657680/datediff-with-minute-does-not-return-expected-value – c00000fd