1

在评估间隔时,postgres 似乎将一个月准确定义为 30 天,即使一个月有 31 天:

select age('2021-03-31 23:59:59.999', '2021-03-01'::date)

回报:30 days 23:59:59.999

在 3 月的情况下不到 1 个月。

然而:

select age('2021-03-31 23:59:59.999', '2021-03-01'::date) <= '1 month'

评估为false

一个(不是很干净的)解决方案是:

select age('2021-03-31 23:59:59.999', '2021-03-01'::date) <= case (select DATE_PART('days', DATE_TRUNC('month', '2021-03-31'::Date) + '1 MONTH'::interval - '1 DAY'::INTERVAL)) 
when 31 then '31 days'::interval when 30 then '30 days'::interval 
when 29 then '29 days'::interval else '28 days'::interval end

我的问题分为两部分:

  1. 为什么 postgresql 将一个月定义为 30 天,特别是在我将两个日期作为内置函数的输入的情况下?
  2. 我的问题有比上面的代码片段更干净的解决方案吗?
4

1 回答 1

1

也许间隔“1个月”是模棱两可的。是 28、29、30 还是 31 天,因为它们都是正确的,具体取决于哪个月份。没有什么可比较的,它似乎只选择 1。尝试重新制定比较。

select '2021-03-31 23:59:59.999'::timestamp - interval '1 month' <  '2021-03-01'::date
于 2021-05-05T23:50:26.663 回答