【问题标题】:How to fix PostgreSQL Interval Syntax Error如何修复 PostgreSQL 间隔语法错误
【发布时间】:2020-06-12 14:04:51
【问题描述】:

下面的代码可以在我的本地机器 MySQL 8.0 上运行,但不能在 PostgreSQL 上运行。

DB::raw('sum(CASE WHEN date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) THEN f.amount ELSE 0 END ) as last_month')

有人知道如何解决吗?

错误:

syntax error at or near \"30\"\nLINE 1: ...um(CASE WHEN date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) TH...\n                                                            ^ (SQL: 

【问题讨论】:

  • PostgreSQL 间隔应该用引号括起来,即interval '30 day'

标签: sql postgresql date


【解决方案1】:

日期函数和语法因数据库而异。您不能只是将此类代码从一个数据库移植到另一个数据库并期望它能够按原样工作。

Postgres 想要一个文字字符串作为间隔描述。它还支持标准的filter 聚合和窗口函数,可用于将您的代码简化为:

sum(f.amount) filter(where date >= current_date - interval '30' day) as last_month

如果你想要0,当组中没有对应的行时:

coalesce(
    sum(f.amount) filter(where date >= current_date - interval '30' day), 
    0
) as last_month

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2020-04-09
  • 2017-08-30
  • 2023-03-09
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多