在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
相关产品推荐
相关产品推荐

