我在项目 YML 中定义了一个
var("run_date")
,将昨天作为日期,使用 dbt_date.yesterday()
如果我在 SQL 中使用它,它就可以正常工作。不过,我使用此设置是为了能够使用 CLI 覆盖该值。 但是当我做类似的事情时
dbt run --select test_model --vars '{run_date: "2023-12-01"}'
它只是作为
2023-12-01
传递,并且 SQL 失败。
我尝试了在命令中使用 ', " 或不使用 ', " 的不同方法,但似乎没有任何效果。
我正在使用以下 SQL 来测试它;
{% set run_date_dash = var("run_date") %}
SELECT REPLACE(SAFE_CAST( {{ run_date_dash }} as STRING), "-","") as test_date
另一个问题中的某人通过简单地在 sql 中添加 '' 解决了他的问题,但这在这里不起作用,因为默认情况下
run_date
是 DATE 类型
有什么建议可以直接解决这个问题,还是我应该构建一些 jinja 条件来检查变量是否被否决或其他什么?
更新: 作为 SELECT,下面的代码似乎可以工作,但可能不是最好的解决方案。我的问题是 var("run_date") 默认情况下是 dbt_date.yesterday(),这只是一个 SQL 语句。如果我是正确的,这不会在宏中执行?所以使用宏不是这里的解决方案。
但是,现在尝试在 WHERE 语句中使用它似乎也有问题,但这可能是另一个问题..
{% set run_date_dash = var("run_date" %}
{% if run_date_dash == dbt_date.yesterday() %}
SELECT
1 as test,
REPLACE(CAST(
cast(
datetime_add(
cast(
cast(timestamp(datetime(current_timestamp(), 'Europe/Amsterdam')) as date) as datetime
),
interval -1 day
) as date
) as STRING
), "-", "") as test_date
{% else %}
SELECT
1 as test,
REPLACE(CAST('{{ run_date_dash }}' as STRING), "-", "") as test_date
{% endif %}
尝试使用宏,但是
有几件事需要澄清:
dbt_date.yesterday()
不是 SQL,它是 dbt jinja 宏。必须在内部调用它{{ }}
。感谢使用跨方言宏。var
的
dbt_project.yml
中的
dbt_date.yesterday()
中的
{{ }}
永远不会计算,因为
var
只被视为字符串。 (我知道这很烦人。)
var
和
env_var
是不同的变量类型。
var("run_date")
是日期类型。它是日期格式,但我敢打赌它的类型是字符串。
run_date
传递给 dbt 时,然后使用该日期,否则使用昨天的日期。”实现这一目标的方法是
{{ env_var('run_date', dbt_date.yesterday()) }} ::date
。
::date
假设您使用的是支持该转换语法的 SQL 方言。注意:如果您使用 dbt Cloud,您需要将变量命名为
DBT_run_date
而不是
run_date
。