这已经出现过几次,例如,在postgresql 新闻组和wiki中。一般来说,不同interval
s 之间的关系可能没有很好地定义 - 一个月可以是不同的天数,具体取决于正在考虑的月份(和年份)。但有时需要计算两个时间点之间发生了多少间隔,例如(简化示例):
CREATE TABLE recordings(tstart timestamp, tend timestamp, interval ticklength);
SELECT (tend - tstart) / ticklength AS numticks
FROM recordings;
这在 PostgreSQL 中是不允许的,因为它是两个间隔之间的划分,由于上述原因,它没有明确定义的一般行为。当间隔可以转换为秒时,存在一种解决方法,但是如果不是这种情况,例如,当间隔为毫秒级时,最好的方法是什么?
正如@a_horse_with_no_name 在他的评论中提到的那样,除法可以通过转换为毫秒来实现。
您链接到的解决方法(从间隔中提取纪元并除以它们)在几秒钟和几毫秒内都可以正常工作。因此,如果这是您的用例,请使用它。
但是,如果您想更通用并在无法回答时返回 NULL,我们必须更复杂:
虽然目前 Postgres 似乎不支持间隔除法,但您当然可以将这些间隔转换为可以除法的数字 - 例如秒。
其他建议的答案建议:
EXTRACT(MILLISECOND FROM interval '1 day')
,但我发现这有时会返回0
。当然,一个人不能被零除。但以下工作更好,更可靠:
EXTRACT(EPOCH, interval)
所以要划分间隔 - 使用并划分这些间隔中的秒数。接受的答案是错误的。
我认为您不应该添加从间隔中提取的毫秒数,因为从间隔中提取的时期已经以毫秒为单位提取秒数。文档说:
你可以试试:
您看到这里的“.123”如何告诉我们毫秒已经包括在内了吗?
我认为为间隔添加除法运算符早就应该了。
有了这个:
一些警告:
儒略年,但不是平均儒略月。