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
相关产品推荐
相关产品推荐

