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

如何使dbt CLI传入的日期变量保留引号编译为字符串?

解决dbt日期变量编译后丢失引号的问题

问题重现

执行以下命令传入日期变量:

dbt run --vars "{start_date: '2022-08-01', end_date: '2022-08-02'}"

SQL模板中使用变量:

WHERE session_date BETWEEN {{ var('start_date') }} AND {{ var('end_date') }}

编译后SQL丢失引号,导致报错:

WHERE session_date BETWEEN 2022-08-01 AND 2022-08-02

错误提示:No matching signature for operator BETWEEN for argument types: DATE, INT64, INT64

解决方法

方法1:在SQL模板中显式添加单引号

直接在变量外层包裹单引号,确保编译后生成带引号的字符串:

WHERE session_date BETWEEN '{{ var('start_date') }}' AND '{{ var('end_date') }}'

编译后的SQL会变成:

WHERE session_date BETWEEN '2022-08-01' AND '2022-08-02'

SQL引擎会自动将带引号的字符串识别为DATE类型,避免类型不匹配错误。

方法2:修正命令行变量传递方式

如果希望在命令行传递带引号的变量,需处理shell的引号解析问题:

  • 使用单引号包裹整个--vars参数:
dbt run --vars '{start_date: "2022-08-01", end_date: "2022-08-02"}'
  • 或在双引号内转义内部的双引号:
dbt run --vars "{start_date: \"2022-08-01\", end_date: \"2022-08-02\"}"

注意:即使这样传递变量,仍建议在SQL模板中添加单引号,因为dbt默认不会为字符串变量自动添加引号。

方法3:显式转换为DATE类型

为避免类型歧义,可使用SQL的类型转换函数明确指定变量类型:

WHERE session_date BETWEEN CAST('{{ var('start_date') }}' AS DATE) AND CAST('{{ var('end_date') }}' AS DATE)

这种方式兼容性更强,尤其适用于对类型校验严格的SQL引擎(如BigQuery)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:33:15