年龄小于或等于一个月的计算结果为 False

Age Less than or Equal to a month evaluates to False

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

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

Returns: 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. 对于我的问题,是否有比上述代码片段更简洁的解决方案?

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

select '2021-03-31 23:59:59.999'::timestamp - interval '1 month' <  '2021-03-01'::date