这是我的另一个问题(Find difference between timestamps in seconds in PostgreSQL using JOOQ)的后续问题。
我想对TIMETRACKS.ENDTIME
和TIMETRACKS.STARTTIME
的差异求和,以秒为单位。可能会发生数据库中没有任何TIMETRACKS
的情况。在这种情况下,数据库应该返回0
。
这就是TIMETRACKS
表的样子:
CREATE TABLE "TimeTracks" (
"id" uuid PRIMARY KEY,
"startTime" timestamp NOT NULL,
"endTime" timestamp,
);
这是我尝试过的一种解决方案:
coalesce(sum(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME)), 0)
但是合并不适用于间隔类型:
org.postgresql.util.PSQLException: ERROR: COALESCE types interval and integer cannot be matched
Another solution实际上对我有用,但似乎有点“复杂”,因为我必须编写一些原始SQL:
coalesce(sum(extractEpochFrom(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME))), 0)
fun extractEpochFrom(field: Field<DayToSecond>): Field<Integer> =
DSL.field("extract(epoch from {0})", Integer::class.java, field)
是否有不需要我编写原始SQL的有效解决方案?
答案 0 :(得分:1)
目前唯一可行的解决方案是使用here中的普通SQL。
coalesce(sum(extractEpochFrom(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME))), 0)
fun extractEpochFrom(field: Field<DayToSecond>): Field<Integer> =
DSL.field("extract(epoch from {0})", Integer::class.java, field)