dbt jinja 的 if 块在检查值时接受 SQL 函数吗?

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

我正在尝试根据日期在 dbt 代码中创建逻辑流程。第一次尝试如下所示:

{% if '2024-01-17' == dateadd(day,-1,current_date()) %}

select current_date() as the_date

{% else %}

select dateadd(day,-1,current_date()) as the_date

{% endif %}

编译失败,错误提示

current_date
未定义。

我尝试在 if 块中引用该函数,如下所示:

{% if '2024-01-17' == 'dateadd(day,-1,current_date())' %}

select current_date() as the_date

{% else %}

select dateadd(day,-1,current_date()) as the_date

{% endif %}

它编译得很好,但这是因为 dbt 将 'dateadd(day,-1,current_date())' 视为字符串,并且它不等于 '2024-01-17' 因此它执行 {% else %} 块.

此问题发布于 2024-01-18,因此

dateadd(day,-1,current_date())
应等于“2024-01-17”,因此理想情况下应执行 {% if %} 块。

我应该更改什么才能执行 {% if %} 块?

感谢您的帮助。

sql jinja2 dbt
2个回答
0
投票

我认为最接近的方法是使用 dbt 的 Jinja 变量

run_started_at
(请参阅文档此处):

{% if run_started_at.strftime('%Y-%m-%d') == '2024-01-17' %}

  select current_date() as the_date

{% else %}

  select dateadd(day, -1, current_date()) as the_date

{% endif %}

0
投票

要将昨天的日期作为 Jinja2 中的字符串,您可以尝试以下操作:

{% set yesterday = (modules.datetime.datetime.now() - modules.datetime.timedelta(days=1)).strftime("%Y-%m-%d") %}

因此,您的代码将转换为:

{% if '2024-01-17' == (modules.datetime.datetime.now() - modules.datetime.timedelta(days=1)).strftime("%Y-%m-%d") %}

select current_date() as the_date

{% else %}

select dateadd(day,-1,current_date()) as the_date

{% endif %}

但是,最佳实践是不要在模板中包含逻辑。此外,SQL 允许我们完全按照您的意愿去做:

SELECT 
    CASE WHEN CURRENT_DATE() - 1 = DATE('2024-01-17')
        THEN CURRENT_DATE()
        ELSE DATEADD(DAY, -1, CURRENT_DATE())
    END AS the_date

如果你的日期是一个变量,你也可以直接在 SQL 代码中使用它,如下所示:

{% set date_check = '2024-01-17' %}
SELECT 
    CASE WHEN CURRENT_DATE() - 1 = DATE('{{ date_check }}')
        THEN CURRENT_DATE()
        ELSE DATEADD(DAY, -1, CURRENT_DATE())
    END AS the_date 

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.