DuckDB版本:v0.10.2, Python版本:3.11.4
当我尝试使用 DATE_ADD 函数时,它会引发 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"
如果我改变线路
SELECT DATE_ADD(CAST(p.cdate AS DATE), INTERVAL p.days DAY) pp
到
SELECT DATE_ADD(CAST(p.cdate AS DATE), INTERVAL 5 DAY) pp
它正在按预期工作。尝试将 p.days 显式转换为 INTEGER,这也导致了相同的异常。
DuckDB 解析器此处仅接受整数和字符串常量。要使用表达式,您需要将其放在括号中。
| ConstInterval '(' a_expr ')' opt_interval
{
$$ = makeIntervalNode($3, @3, $5);
}
| ConstInterval Iconst opt_interval
{
$$ = makeIntervalNode($2, @2, $3);
}
| ConstInterval Sconst opt_interval
{
$$ = makeIntervalNode($2, @2, $3);
}