2012-09-30 39 views
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 

回答

1

你的兩個查詢之間,真的有ISN」差別很大。可以這麼說,整數運算比浮點運算速度稍微快一點,所以如果SECONDS報告可以接受的話,你可以選擇後者。

+0

謝謝。另外,不會在N條記錄(比如100,000條)上進行分割比將100,000條轉換爲BIGINT更慢? – c00000fd

+0

從int(int32)到bigint的投射並不像你想象的那麼昂貴,所以是的,這也可以發揮偏好後者的作用。 – RichardTheKiwi

+0

還有關於您的評論「由SECONDS報告是可以接受的」。它不是「可以接受的」,它是必不可少的!如果我不這樣做,我會失去精確度。這裏有一個例子:http://stackoverflow.com/questions/12657680/datediff-with-minute-does-not-return-expected-value – c00000fd