首页 > 解决方案 > 基于日期范围 Postgresql 返回值时出错

问题描述

我有一个查询要带上每个月最后 5 年的值,它一直有效,直到您在最后一天不同的几个月内到达(例如 31 或 29)

   SELECT isin, nominal_comulativo , periodo_base
   FROM lamina_perfil
   WHERE isin = 'PERFIL 2020'
   AND periodo_base >= date '2019-03-31' - INTERVAL '5 years'
   AND periodo_base <=  '2019-03-31'

我的结果看起来像这样

+----------------+--------------------+--------------+
|     ISIN       | nominal_comulativo | periodo_base |
+----------------+--------------------+--------------+
| PERFIL 2020    | 1.04               | 2014-03-31   |
+----------------+--------------------+--------------+
| PERFIL 2020    | 2.45               | 2014-04-30   |
+----------------+--------------------+--------------+
| PERFIL 2020    | 1.34               | 2014-05-30   |
+----------------+--------------------+--------------+
| PERFIL 2020    | 1.34               | 2014-06-30   |
+----------------+--------------------+--------------+
| PERFIL 2020    | 1.34               | 2014-07-31   |
+----------------+--------------------+--------------+
| PERFIL 2020    | 1.34               | 2014-08-29   |
+----------------+--------------------+--------------+

但是当我设置 WHERE 条件不同时,比如

period_base> = date '2019-02-31' - INTERVAL '5 years'
AND period_base <= '2019-02-31'

它给了我错误'日期/时间字段值超出范围:“2019-02-31”'
其他人?

标签: sqlpostgresqldate

解决方案


Postgres 在理解日期间隔方面非常灵活,因此您可以如下表达您的条件:

periodo_base >= date'2019-04-01' - interval '1 day 5 years'
and periodo_base <=  date'2019-04-01' - interval '1 day'

这可以缩短一点between

periodo_base 
    between date'2019-04-01' - interval '1 day 5 years' 
    and date'2019-04-01' - interval '1 day'

推荐阅读