Вычислить среднее в базе данных SQL - PullRequest
4 голосов
/ 01 апреля 2019

Мне нужно получить среднее значение, округленное до 2 десятичных точек, с разницей в две даты.

Используя 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 Ответ

5 голосов
/ 01 апреля 2019

Проблема не в Average, а в вычислении промежутка времени - в настоящее время EF Core (2.x) не поддерживает общий перевод SQL вычислений промежутка времени.

Для SqlServer, хотя вы могли бы использовать некоторые DateDiff методов, представленных в EF Core 2.1.Все они возвращают int значений, поэтому вы не можете напрямую использовать DateDiffDay, чтобы получить эквивалент TimeSpan.TotalDays, но вы можете использовать DateDiffHour / 24d или DateDiffMinute / (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
...