You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core 7+PostgreSQL下如何在数据库端计算TimeSpan平均值?

在EF Core 7 + PostgreSQL中实现数据库端计算时间差统计值

你的问题核心是EF Core无法翻译.Ticks属性的访问,导致无法在数据库端计算平均值。以下两种方案可以解决这个问题,且均在数据库端完成计算,避免客户端处理大数据集:

方案1:使用EF Core内置的日期差函数

通过EF.Functions.DateDiffTick直接计算两个时间的Ticks差,该函数可被EF Core翻译为PostgreSQL对应的SQL逻辑,再对Ticks求平均后转换为TimeSpan:

var stats = await _context
    .Jobs
    .GroupBy(x => x.Name)
    .Select(x => new Stats(
        x.Min(y => y.Stopped - y.Started),
        TimeSpan.FromTicks((long)x.Average(y => EF.Functions.DateDiffTick(y.Stopped, y.Started))),
        x.Max(y => y.Stopped - y.Started)
    ))
    .ToListAsync();

方案2:直接利用PostgreSQL的interval类型支持

Npgsql(PostgreSQL的EF Core驱动)支持将DateTime - DateTime的结果映射为PostgreSQL的interval类型,而PostgreSQL原生支持对interval求平均。只需直接对时间差求平均即可,EF会自动翻译为对应的SQL:

var stats = await _context
    .Jobs
    .GroupBy(x => x.Name)
    .Select(x => new Stats(
        x.Min(y => y.Stopped - y.Started),
        x.Average(y => y.Stopped - y.Started),
        x.Max(y => y.Stopped - y.Started)
    ))
    .ToListAsync();

注意:方案2需要使用7.x及以上版本的Npgsql驱动,确保AVG(interval)的翻译逻辑正常工作。

内容的提问来源于stack exchange,提问作者lonix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:52:54