日期SQL和C#中两个日期计算之间的日期差异产生不同的结果

时间:2015-06-26 11:48:19

标签: c# sql-server database

我正在计算两个日期的日差。 在C#

diffdays = (EndDate-StartDate).Days

所以考虑到Enddate为2015年6月26日,并且在2015年6月10日开始时,diffdays值为15,如调试时的Autos部分所示。

在SQL服务器中,我正在做的是

SELECT DATEDIFF(day, StartDate, EndDate )

其中EndDate是2015年6月26日,startdate是2015年6月10日,结果为16。

我需要这两天的差异是一样的。我做错了什么?

4 个答案:

答案 0 :(得分:4)

TimeSpan.Days属性仅返回整天,丢弃任何小数部分。根据您的两个DateTime的时间部分,您可能会看到您所看到的行为。

尝试使用Date属性将时间部分取出等式(并有效地将两次设置为午夜):

diffdays = (EndDate.Date - StartDate.Date).Days

或者,您可以对TotalDays属性进行舍入(包括天数的小数部分):

diffdays = Math.Ceiling((EndDate - StartDate).TotalDays);

答案 1 :(得分:1)

SQL的

DATEDIFF函数计算通过指定为单位的边界的次数,而.NET的DateTime.Subtract()函数(通过使用minus运算符隐式使用此函数)返回实际两个日期之间TimeSpan,因此您必须看到两个结果之间存在差异。

实施例

以下查询将返回1:

SELECT DATEDIFF(day, '1/1/2015 23:58:00', '1/2/2015 00:02:00')

两个日期之间只有4分钟的差异,但由于两个日期(午夜12:00)之间经过了一天的边界,它返回1.相同的两个日期将返回{{1}在C#中4分钟。如果您仅查看该TimeSpan对象的Days部分(不是TotalDays)(正如您上面所做的那样),您将获得0。

答案 2 :(得分:0)

在C#中,您计算​​两个日期之间的天数。在SQL中,DATEDIFF函数是计算第一个日期之后的天数,包括结束日期。

要解决此问题,最简单的方法是在C#diffdays变量中添加1。

答案 3 :(得分:0)

您的C#代码返回奇怪的结果...我创建了简单的控制台应用程序,并且变量的差异等于16,就像在sql server中一样

 DateTime startDate = new DateTime(2015, 6, 10);
 DateTime endDate = new DateTime(2015, 6, 26);
 var differ = (endDate - startDate).Days;

请仔细检查您的C#结果