我正在尝试根据日期在 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 %} 块?
感谢您的帮助。
我认为最接近的方法是使用 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 %}
要将昨天的日期作为 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
我希望这有帮助!