带分钟的DATEDIFF不会返回预期值

说,我有以下带有数据的SQL Server 2008表:

CREATE TABLE tbl (dtIn DATETIME2, dtOut DATETIME2) INSERT tbl VALUES ('9/10/2012 5:14:10 AM', '9/10/2012 5:15:09 AM'), ('9/10/2012 5:16:12 AM', '9/10/2012 5:18:12 AM'), ('9/10/2012 5:18:43 AM', '9/10/2012 5:23:04 AM'), ('9/10/2012 5:25:17 AM', '9/10/2012 5:26:05 AM'), ('9/10/2012 5:26:57 AM', '9/10/2012 5:29:19 AM'), ('9/10/2012 5:31:41 AM', '9/10/2012 5:32:41 AM'), ('9/10/2012 5:33:16 AM', '9/10/2012 5:34:08 AM'), ('9/10/2012 5:35:25 AM', '9/10/2012 5:49:46 AM'), ('9/10/2012 5:55:35 AM', '9/10/2012 5:56:48 AM'), ('9/10/2012 5:58:54 AM', '9/10/2012 5:59:59 AM') 

然后我运行了这个查询 :

 WITH ctx AS( SELECT datediff(minute, dtIn, dtOut) AS d FROM tbl ) SELECT SUM(d) FROM ctx 

我得到30分钟。

但是当我用C#尝试相同的时候:

 double fM = 0; fM += (DateTime.Parse("9/10/2012 5:15:09 AM") - DateTime.Parse("9/10/2012 5:14:10 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:18:12 AM") - DateTime.Parse("9/10/2012 5:16:12 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:23:04 AM") - DateTime.Parse("9/10/2012 5:18:43 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:26:05 AM") - DateTime.Parse("9/10/2012 5:25:17 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:29:19 AM") - DateTime.Parse("9/10/2012 5:26:57 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:32:41 AM") - DateTime.Parse("9/10/2012 5:31:41 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:34:08 AM") - DateTime.Parse("9/10/2012 5:33:16 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:49:46 AM") - DateTime.Parse("9/10/2012 5:35:25 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:56:48 AM") - DateTime.Parse("9/10/2012 5:55:35 AM")).TotalMinutes; fM += (DateTime.Parse("9/10/2012 5:59:59 AM") - DateTime.Parse("9/10/2012 5:58:54 AM")).TotalMinutes; 

我得到fM = 29.016666666666669。

通过向每个C#语句添加Math.Round(),我得到28.0。 通过添加Math.Floor(),我得到25.0。 通过添加Math.Ceiling我得到33.0。

有人可以解释这种差异吗?

每个的返回值都是衡量不同的东西。

在这里注意DATEDIFF文档是明智的:

返回指定的startdate和enddate之间交叉的指定datepart边界的计数(有符号整数)。

这导致以下2秒间隔:

 SELECT datediff(minute, '9/10/2012 5:14:59 AM', '9/10/2012 5:15:01 AM') 

返回1因为它跨越了一个分钟边界。 我怀疑你没有考虑到这种行为。