我在文档中找不到任何可以解释此方法详细信息的内容。因为它总是返回整数,所以不能区分3:20的时差和3:10的时差。但是它是向上取整还是向下取整,还是只是比较2个小时的小时数部分?
例:
营业时间= 2014-06-12 13:35:00.000
收录时间= 2014-06-13 14:30:00.000
实际的差异是24小时55分钟。这会返回24小时或25小时的差异吗?
我需要确定两次相隔25小时或更长时间;我可以为此使用DiffHours,还是需要使用DiffSeconds并将结果除以3600以获取实际小时数?
最佳答案
关于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
是通过计算日期部分的边界来工作的,因此它只是截断所有秒并仅比较年,月,日和小时部分。证明:
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