年龄小于或等于一个月的计算结果为 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
我的问题分为两部分:
- 为什么 postgresql 将一个月定义为 30 天,特别是在我将两个日期作为内置函数的输入的情况下?
- 对于我的问题,是否有比上述代码片段更简洁的解决方案?
也许间隔“1 个月”不明确。是 28、29、30 还是 31 天,因为它们都是正确的,具体取决于哪个月。没有什么可比较的,似乎只选择 1。尝试重新制定比较。
select '2021-03-31 23:59:59.999'::timestamp - interval '1 month' < '2021-03-01'::date
评估时间间隔时,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
我的问题分为两部分:
- 为什么 postgresql 将一个月定义为 30 天,特别是在我将两个日期作为内置函数的输入的情况下?
- 对于我的问题,是否有比上述代码片段更简洁的解决方案?
也许间隔“1 个月”不明确。是 28、29、30 还是 31 天,因为它们都是正确的,具体取决于哪个月。没有什么可比较的,似乎只选择 1。尝试重新制定比较。
select '2021-03-31 23:59:59.999'::timestamp - interval '1 month' < '2021-03-01'::date