You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在DuckDB中使用DATE_ADD函数触发ParserException问题求助

DuckDB中DATE_ADD使用列作为间隔值触发ParserException的解决办法

环境信息

  • DuckDB版本:v0.10.2
  • Python版本:3.11.4

问题重现

执行以下代码时触发ParserException:

data = [['2020-01-01', 4], ['2020-01-02',5]]
p = pd.DataFrame(data, columns=['cdate', 'days'])
print(p.info())
q = """
    SELECT DATE_ADD(CAST(p.cdate AS DATE), INTERVAL p.days DAY) pp
    FROM p 
"""
duckdb.sql(q).df()

报错内容:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   cdate   2 non-null      object
 1   days    2 non-null      int64 
dtypes: int64(1), object(1)
memory usage: 164.0+ bytes
None
---------------------------------------------------------------------------
ParserException                           Traceback (most recent call last)
Cell In[42], line 8
      3 print(p.info())
      4 q = """
      5     SELECT DATE_ADD(CAST(p.cdate AS DATE), INTERVAL p.days DAY) pp
      6     FROM p 
      7 """
----> 8 duckdb.sql(q).df()

ParserException: Parser Error: syntax error at or near "p"

当把INTERVAL p.days DAY改为INTERVAL 5 DAY时可正常执行,显式转换p.days为INTEGER也无法解决问题。

问题原因

DuckDB的SQL语法规定,INTERVAL关键字后只能跟字面量数值,不能直接引用列名,因此INTERVAL p.days DAY这种写法会触发语法解析错误。

解决方案

提供两种可行的替代写法:

方案1:使用DATE_ADD的三参数重载形式

DATE_ADD支持直接传入日期列、增量列、时间单位三个参数,无需使用INTERVAL关键字:

q = """
    SELECT DATE_ADD(CAST(p.cdate AS DATE), p.days, 'DAY') pp
    FROM p 
"""

方案2:利用日期加法结合间隔乘法

将列值与INTERVAL 1 DAY相乘,再和目标日期相加:

q = """
    SELECT CAST(p.cdate AS DATE) + p.days * INTERVAL 1 DAY pp
    FROM p 
"""

两种写法都能正确计算出日期加上对应天数后的结果,替换原SQL即可解决问题。


内容的提问来源于stack exchange,提问作者Tapabrata Mukherjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:50:11