PostgreSQL区间划分

bel*_*daz 7 postgresql time

这个问题已经出现过几次了,例如在postgresql 新闻组wiki中。一般来说,不同intervals 之间的关系可能没有明确定义 - 一个月可能有不同的天数,具体取决于所考虑的月份(和年份)。但有时需要计算两个时间点之间发生了多少个间隔,例如(简化示例):

CREATE TABLE recordings(tstart timestamp, tend timestamp, interval ticklength);

SELECT (tend - tstart) / ticklength AS numticks
FROM recordings;
Run Code Online (Sandbox Code Playgroud)

这在 PostgreSQL 中是不允许的,因为它是两个间隔之间的划分,由于上述原因,这不会有明确定义的一般行为。当间隔可以转换为秒时,存在一种解决方法,但如果不是这种情况,例如当间隔为毫秒量级时,最好的方法是什么?

bel*_*daz 3

正如 @a_horse_with_no_name 在他的评论中提到的,除法可以通过转换为毫秒来实现。

SELECT 
  (1000*EXTRACT(EPOCH FROM tend - tstart) 
    + EXTRACT(MILLISECOND FROM tend - tstart))
  / (1000*EXTRACT(EPOCH FROM ticklength) 
    + EXTRACT(MILLISECOND FROM ticklength)) AS numticks
FROM recordings;
Run Code Online (Sandbox Code Playgroud)