【问题标题】:Error returning values based on date range Postgresql基于日期范围 Postgresql 返回值时出错
【发布时间】:2019-12-11 17:59:37
【问题描述】:

我有一个查询要带上每个月最近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”'
其他人?

【问题讨论】:

  • “2019-02-31”,2 月 31 日,不是有效日期。 2 月只有 28 或 29 天。

标签: sql postgresql date


【解决方案1】:

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'

【讨论】:

    【解决方案2】:

    如果你的桌子不是很大,那么如何:

    SELECT isin, nominal_comulativo, periodo_base
    FROM lamina_perfil
    WHERE isin = 'PERFIL 2020' AND
          DATE_TRUNC('month', periodo_base) = '2019-03-01' AND
          periodo_base >= DATE_TRUNC('year', now()) - INTERVAL '5 year'
    

    【讨论】:

      【解决方案3】:

      更喜欢半开区间


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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多