postgresql - 如何减去瞬间并与 jOOQ 中的持续时间进行比较
问题描述
我正在尝试使用 jOOQ for Postgres 编写此查询:
SELECT * FROM my_table t WHERE t.instant1 - t.instant2 > interval '1 days';
所以我写了这个:
Duration oneDay = Duration.ofDays(1);
using(configuration)
.selectFrom(MY_TABLE)
.where(MY_TABLE.INSTANT1.minus(MY_TABLE.INSTANT2).gt(oneDay))
但它没有编译,因为:
无法解析方法“lt(java.time.Duration)”
我尝试包装oneDay
aval()
然后错误更改为:
无法解析方法“lt(org.jooq.Param)”
我认为问题在于该方法minus
返回 aField<Instant>
而不是 a Field<Duration>
,但在 Postgres 中,当减去 2 时TIMESTAMP WITH TIME ZONE
,结果是 a interval
。
沿着这些思路,jOOQ 甚至允许我编写这个在运行时会失败的查询,因为类型不会对齐:
using(configuration)
.selectFrom(MY_TABLE)
.where(MY_TABLE.INSTANT1.minus(MY_TABLE.INSTANT2).gt(Instant.now()))
我可以使用其他任何 jOOQ 方法吗?除了做类似的事情:
"{0} - {1} > interval '1 day'"
谢谢。
解决方案
jOOQ 3.12 在区间和区间算术支持方面仍有一些限制。我能想到的最好的方法是改变你的表达方式:
t.instant1 - t.instant2 > interval '1 days'
对等
t.instant1 > t.instant2 + interval '1 days'
在 jOOQ 中很容易表示:
T.INSTANT1.gt(T.INSTANT2.plus(1))
推荐阅读
- asp.net - ASP C# - 注销操作重定向不起作用
- python - Groupby nunique 与独特的分类数据
- java - Java“AWT-EventQueue-0”java.lang.NullPointerException
- macros - nom 的 "$i" 宏参数从何而来?
- elasticsearch - 使用 go 在 elasticsearch 中进行大规模更新
- java - 在 Criteria API 中按目标加入
- r - 使用函数 filter() 计算移动平均值时出现“无适用方法”错误
- vba - 以编程方式插入构建基块时出现自动化错误 Word 2016
- javascript - 手动更新 redux 状态时更改了 redux 状态引用
- sql-server - 同一张表上分组行的差异和百分比变化