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

Hasura中如何按日期+时间范围查询timestamptz字段数据?

解决Hasura中timestamptz字段的日期+时段筛选问题

先直接回应你的疑问

  • 不建议转成timetz类型:Hasura的GraphQL API目前不支持timetz作为查询参数类型,就算把字段转成timetz,依然没法用时间字符串做筛选参数,反而会触发类型错误。
  • 创建视图新增时间字段是可行的,同时还有更直接的查询方案,无需额外建视图。

方案1:直接在查询中筛选时段(无需额外字段)

利用PostgreSQL的时间函数,在Hasura查询中通过_expr注入自定义SQL条件,结合日期范围筛选:

比如要筛选ts在2022-01-24至2022-02-01,且时间在14:00-16:00的条目,GraphQL查询示例:

query FilterTimeRangeEntries {
  your_table(
    where: {
      ts: {_gte: "2022-01-24T00:00:00Z", _lte: "2022-02-01T23:59:59Z"},
      _and: [
        {_expr: {sql: "EXTRACT(EPOCH FROM ts::time) >= EXTRACT(EPOCH FROM '14:00'::time)"}},
        {_expr: {sql: "EXTRACT(EPOCH FROM ts::time) < EXTRACT(EPOCH FROM '16:00'::time)"}}
      ]
    }
  ) {
    id
    ts
    # 其他需要返回的字段
  }
}

用EXTRACT(EPOCH FROM ...)是为了精确比较时间(避免字符串比较的边界问题),如果只需要按小时筛选,也可以简化成:

EXTRACT(HOUR FROM ts) >= 14 AND EXTRACT(HOUR FROM ts) < 16

方案2:创建视图新增时间字段(适合频繁复用该筛选条件)

如果需要多次用到这个时间筛选,可以在PostgreSQL中创建视图,提取ts的时间部分:

CREATE VIEW your_table_with_time AS
SELECT 
  *,
  ts::time AS ts_time  -- 提取纯时间部分,类型为time(Hasura支持该类型)
FROM your_table;

在Hasura控制台中同步这个视图后,就可以直接在GraphQL查询中同时筛选日期范围和时间:

query FilterWithView {
  your_table_with_time(
    where: {
      ts: {_gte: "2022-01-24T00:00:00Z", _lte: "2022-02-01T23:59:59Z"},
      ts_time: {_gte: "14:00", _lt: "16:00"}
    }
  ) {
    id
    ts
    ts_time
    # 其他字段
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:15:32