计算数据库SQL中的平均值

时间:2019-04-01 18:27:12

标签: c# sql-server entity-framework-core

我需要获取两个日期之间相差的平均值,四舍五入到小数点后两位。

使用Entity Framework Core,我使用了以下内容:

var average = await games
  .Where(x => x.Finish.HasValue)
  .AverageAsync(x => Math.Round((x.Finish.Value - x.Start).TotalDays, 2));

这似乎正在内存中运行。

如何计算数据库(SQL)的平均值?

1 个答案:

答案 0 :(得分:5)

问题不是Average,而是时间跨度计算-当前,EF Core(2.x)不支持时间跨度计算的通用SQL转换。

对于SqlServer,尽管您可以使用EF Core 2.1中引入的一些DateDiff方法。它们全部返回int的值,因此您不能直接使用DateDiffDay来获得TimeSpan.TotalDays的等效值,但是可以使用DateDiffHour / 24dDateDiffMinute / (24d * 60)等。模拟它。

例如,

var average = await games
    .Where(x => x.Finish.HasValue)
    .AverageAsync(x => Math.Round(EF.Functions.DateDiffHour(x.Start, x.Finish.Value) / 24d, 2));

翻译为

  SELECT AVG(ROUND(DATEDIFF(HOUR, [x].[Start], [x].[Finish]) / 24.0E0, 2))
  FROM [Game] AS [x]
  WHERE [x].[Finish] IS NOT NULL