在 DuckDB 中创建 DATE_ADD 时出现错误

问题描述 投票:0回答:1

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,这也导致了相同的异常。

python duckdb
1个回答
0
投票

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);
                }
© www.soinside.com 2019 - 2024. All rights reserved.