您必须非常小心所谓的“一年”。例如,考虑以下数据:
insert into some_table (id, order_date, cancel_date)
values (1, now() - interval '30 day', now() - interval '10 day'),
(2, now() - interval '2 year', now() - interval '18 month'),
(3, now() - interval '3 year', now() - interval '1 year'),
(4, date '2016-02-29', date '2017-03-01'),
(5, date '2016-02-29', date '2017-02-28'),
(6, date '2019-02-28', date '2020-02-29'),
(7, date '2016-02-01', date '2017-02-01')
现在,根据您选择的“一年”定义,您可以有 2、3、4、6 种,或许还有其他组合满足您的选择标准。
例如,如果您选择使用interval '1 year',如下所示
select *
from some_table t
where t.cancel_date <= t.order_date + interval '1 year';
您会发现id 值为 1、2、5 和 7 的行被选中。
如果您用interval '364 day' 替换上面的间隔,那么只有id 为1 和2 的行会被选中。
使用interval '365 day' 的间隔选择第 1、2 和 5 行。
并且使用interval '366 day'(闰年,你知道:-) 的间隔选择第 1、2、4、5、6 和 7 行。
然后您可以将<= 更改为< 并进一步提高混乱度!
所以你有选择。明智地选择... :-)
db<>fiddle here