如何使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
相关产品推荐
相关产品推荐

