PostgreSQL中如何计算一个INTERVAL包含另一个INTERVAL的次数?
在PostgreSQL中计算一个INTERVAL能容纳在两个TIMESTAMP间隔中的次数
嘿,这个需求我之前也碰到过,PostgreSQL确实不支持直接的INTERVAL / INTERVAL除法运算,但有两种实用的方法可以帮你得到想要的整数结果:
方法一:转换为统一时间单位(适合固定时长的间隔)
如果你的目标间隔是固定时长的(比如小时、分钟、秒,或者固定天数的间隔),最直接的方式是把两个间隔都转换成总秒数(或者更小的单位比如微秒,避免精度丢失),然后做除法再取整。
用你给出的例子来演示:
SELECT FLOOR( EXTRACT(EPOCH FROM (TIMESTAMP '2019-01-30' - TIMESTAMP '2019-01-29')) / EXTRACT(EPOCH FROM INTERVAL '1 hour') )::INTEGER;
这里的EXTRACT(EPOCH FROM interval)会把间隔转换成从1970-01-01以来的总秒数,这样两个数值就能正常做除法了。FLOOR函数用来取整数部分(如果需要向上取整可以用CEIL),最后转成INTEGER类型就能得到24这个结果。
方法二:生成时间序列计数(适合年/月这类可变时长的间隔)
如果你的间隔包含年、月这类时长不固定的单位(比如1个月可能是28-31天),用秒数转换会有误差,这时候可以用generate_series生成时间序列,再通过计数来得到准确次数。
举个例子,计算2019-01-01到2020-01-01之间能容纳多少个3个月的间隔:
SELECT COUNT(*) - 1 FROM generate_series( TIMESTAMP '2019-01-01', TIMESTAMP '2020-01-01', INTERVAL '3 months' );
generate_series会生成从起始时间到结束时间、步长为指定间隔的时间序列,序列包含起始点和结束点,所以用COUNT(*) - 1就能得到准确的间隔次数(上面的例子结果是4)。
注意事项
- 对于固定时长的间隔,方法一效率更高,适合大量数据计算;
- 对于年、月这类可变时长的间隔,方法二更准确,不会因为不同月份天数差异导致误差。
内容的提问来源于stack exchange,提问作者DIBits
相关产品推荐
相关产品推荐

