如何在SQL中计算起始日期后已过的x天间隔数?
SQL计算起始日期到目标日期的指定天数间隔数
问题场景
给定起始日期outset_date和目标日期date_of_interest,需要计算从起始日到目标日为止,已经过去了多少个指定x天的间隔。以x=4天为例:
- 起始日
2023-01-11到2023-01-13(相差2天)→ 返回1(属于第1个4天间隔) - 到
2023-01-18(相差7天)→ 返回2(属于第2个4天间隔) - 到
2023-02-02(相差22天)→ 返回6(属于第6个4天间隔)
测试用表结构与数据:
CREATE TABLE my_tbl (outset_date DATE, date_of_interest DATE); INSERT INTO my_tbl (outset_date, date_of_interest) VALUES ('2023-01-11', '2023-01-13'), ('2023-01-11', '2023-01-18'), ('2023-01-11', '2023-02-02');
MySQL 实现方案
核心逻辑:先计算两个日期的天数差,再通过向下取整后加1的方式得到间隔数(起始日本身属于第1个间隔)。
方法1:使用FLOOR函数
SELECT outset_date, date_of_interest, FLOOR(DATEDIFF(date_of_interest, outset_date) / 4) + 1 AS how_many_intervals_have_passed FROM my_tbl;
方法2:使用CEIL函数
SELECT outset_date, date_of_interest, CEIL((DATEDIFF(date_of_interest, outset_date) + 1) / 4) AS how_many_intervals_have_passed FROM my_tbl;
PostgreSQL 实现方案
PostgreSQL中直接通过日期减法得到天数差,再套用同样的间隔计算逻辑。
方法1:使用FLOOR函数
SELECT outset_date, date_of_interest, FLOOR((date_of_interest - outset_date)::INTEGER / 4) + 1 AS how_many_intervals_have_passed FROM my_tbl;
方法2:使用CEIL函数
注意需用浮点数除法避免整数截断:
SELECT outset_date, date_of_interest, CEIL(((date_of_interest - outset_date)::INTEGER + 1) / 4.0) AS how_many_intervals_have_passed FROM my_tbl;
通用说明
- 若需要修改间隔天数x,只需将语句中的
4替换为目标数值即可。 - 当目标日期等于起始日期时,两种方法都会返回1(符合起始日属于第1个间隔的逻辑)。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

