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

如何将昨日日期作为参数传递给Airflow任务 解决手动触发取值异常

问题根因

prev_execution_date的取值是当前DAG实例上一次成功运行对应的逻辑执行时间,和自然日的「昨日」没有绑定关系。手动触发DAG时,如果该DAG没有历史调度运行记录,Airflow会默认将prev_execution_date赋值为当前触发时刻的时间,自然无法返回预期的昨日日期。

可行解决方案

根据使用场景选择对应方案即可:

  • 方案1:基于逻辑日期偏移计算(适配所有触发场景,稳定性最高)
    放弃依赖prev_execution_date,直接通过Airflow内置的execution_date(当前DAG实例的逻辑时间,语义不受触发方式影响)做日期偏移,将原有模板代码替换为:
    {{ (execution_date - macros.timedelta(days=1)).strftime('%Y-%m-%d') }}
    
    只要DAG运行对应的逻辑日期为当日,无论定时调度还是手动触发,该模板都会稳定返回自然日的昨日日期,不会因为缺少历史运行记录出错。
  • 方案2:手动触发时指定逻辑日期(适配需要保留原有prev_execution_date逻辑的场景)
    手动触发DAG时,在触发配置弹窗中取消默认勾选的「Run as of now」选项,将逻辑日期(旧版本称Execution date)手动设置为当日的调度周期时间,此时Airflow会按照标准调度逻辑计算相邻运行的时间差,prev_execution_date就会正确返回前一天日期。
  • 方案3:代码内直接计算自然日(适配Python自定义任务场景)
    如果任务是Python实现的业务逻辑,不需要依赖模板传参,可以直接在任务代码内计算昨日日期,完全绕开Airflow模板变量的逻辑限制:
    from datetime import datetime, timedelta
    
    def your_task_func(**context):
        yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
        # 后续业务逻辑直接调用yesterday变量即可
    
    该写法无论DAG以何种方式触发,都会取任务运行时刻的自然昨日,适合不需要做历史数据回溯、仅处理每日增量的任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.04 16:15:42