EntityFunctions.DiffHours方法如何工作?

时间:2014-06-12 18:05:38

标签: .net entity-framework datetime timespan

我在文档中找不到任何解释此方法细节的内容。因为它总是返回一个整数,所以它不区分3:20的时差和3:10的时差。但它是向上舍入还是向下舍入,还是仅仅比较2倍的小时部分?

实施例: OpenTime = 2014-06-12 13:35:00.000 CloseTime = 2014-06-13 14:30:00.000

实际差异是24小时55分钟。这会返回24小时或25小时的差异吗?

我需要确定2次是否相隔25小时或更长时间;我可以使用DiffHours吗,或者我是否需要使用DiffSeconds并将结果除以3600以获得实际的小时数?

1 个答案:

答案 0 :(得分:6)

EF的一个好处是它全部是开源的。如果你仔细研究this part of the source code,你会发现:

functionHandlers.Add("DiffHours", HandleCanonicalFunctionDateDiff);

其中涉及:

// <summary>
// Handler for all date/time addition canonical functions.
// Translation, e.g.
// DiffYears(datetime, number) =>  DATEDIFF(year, number, datetime)
// </summary>
private static ISqlFragment HandleCanonicalFunctionDateDiff(SqlGenerator sqlgen, DbFunctionExpression e)
{
    var result = new SqlBuilder();

    result.Append("DATEDIFF (");
    result.Append(_dateDiffFunctionNameToDatepartDictionary[e.Function.Name]);
    result.Append(", ");
    result.Append(e.Arguments[0].Accept(sqlgen));
    result.Append(", ");
    result.Append(e.Arguments[1].Accept(sqlgen));
    result.Append(")");

    return result;
}

所以有你的回答 - 致电EntityFunctions.DiffHours只是转而调用native DATEDIFF function in SQL Server

由于DATEDIFF通过计算datepart边界来工作,因此它只是截断所有秒数并仅比较年,月,日和小时组件。

证明:

SELECT DATEDIFF(hour,'2014-01-01 00:00:00','2014-01-01 01:00:00')
-- returns 1 hour

SELECT DATEDIFF(hour,'2014-01-01 00:00:00','2014-01-01 01:01:00')
-- returns 1 hour

SELECT DATEDIFF(hour,'2014-01-01 00:00:00','2014-01-01 01:59:00')
-- returns 1 hour

SELECT DATEDIFF(hour,'2014-01-01 00:00:00','2014-01-01 00:59:00')
-- returns 0 hours