调度参数来源及其表达式

调度参数是DataWorks中实现任务动态化和配置管理的核心机制。它允许您在代码中使用变量占位符,并在任务调度时为其注入动态值。这不仅解决了周期性任务中硬编码日期带来的维护难题,更通过提供工作空间、工作流、节点上下文和节点本地四级参数体系,实现了配置与代码的分离,极大地提升了任务的灵活性、复用性与环境适应能力。

重要

本文专注于调度参数的赋值来源和表达式语法。在阅读本文前,请确保您已了解调度参数的基本配置方法,参见:配置并使用调度参数

调度参数的赋值来源

调度参数除了支持使用本节点定义的参数外,还支持使用上下文参数、工作流参数和工作空间参数,作用域范围由低到高。

  1. 节点本地定义(本节点)

    在节点调度配置调度参数区域内定义的参数,仅对当前节点有效。可支持丰富的参数表达式,详见下文。

  2. 上下文参数 (跨节点传递)

    用于接收其直接上游节点的输出值。这种方式不仅传递了值,还确立了节点间的调度依赖关系。当一个参数的值需要由上游任务的运行结果动态决定时,使用此方式。可通过单击参数赋值区域的image快捷添加上下文参数,上下文参数详见:配置并使用节点上下文参数

    PixPin_2025-11-25_10-20-21

  3. 工作流参数 (工作流内共享)

    在工作流上定义的参数,可以被该工作流内的所有子节点引用。可通过${workflow.参数名}方式直接引用。工作流参数的参数表达式,也可参照本文。

    PixPin_2025-11-25_10-18-53

  4. 工作空间参数(工作空间内共享)

    在工作空间级别定义的全局参数,该空间下的所有节点都可引用。它最常用于区分开发环境和生产环境的配置,例如,定义一个名为 db_name 的参数,在开发环境的值为 db_dev,在生产环境的值为 db_prod。可在设置调度参数值时直接选择工作空间参数。详见:使用工作空间参数

    PixPin_2025-11-25_10-18-00

参数表达式

调度参数通过定义参数名参数值来定义赋值逻辑,其中参数值支持时间参数系统内置参数常量等多种形式。定义完成后即可在代码中,通过${参数名}的方式来引用。

  • 自定义时间参数:如${...}$[...],可在两种时间基准值(业务日期定时时间)的基础上进行变换,详见:时间参数

  • 系统内置参数:如$bizdate$bizmonth、$jobid,可用于获取业务日期、业务月份、业务流程ID等,不局限于时间类型。详见:系统内置参数

  • 常量:如'123''abc'等。

其中时间参数是调度参数的主要应用场景,用于在任务运行时动态替换各种时间字符串。

时间参数

核心概念:时间基准

DataWorks的所有动态时间参数都基于以下两种核心的时间基准。

概念

定义

参数值

自定义格式

时间精度

业务日期

通常指任务定时运行日期的前一天。在T+1的离线计算场景中,它代表需要处理的业务数据的发生日期。例如,今天统计前一天的营业额,此处的前一天,指交易发生的日期,也就是业务日期。

${yyyymmdd}

${...}

年月日

定时时间

指任务在调度配置中设置调度时间,在任务运行时会被系统替换为任务实例运行的当天。它精确到秒,并独立于任务的实际运行时间。

引用该时间为任务预期执行时间,与实际开始执行时间并非完全一致。任务实际开始执行时间受多方因素影响。

$[yyyymmddhh24miss]

$[...]

年月日时分秒

概念总结:

  • 业务日期 ≈ 昨天 (数据的日期)=$bizdate=${yyyymmdd}

  • 定时时间 ≈ 今天 (任务运行的时间)=$cyctime=$[yyyymmddhh24miss]

一个典型的T+1任务就是:在今天(定时时间)的凌晨,启动一个任务,去处理昨天(业务日期)的数据。

以下为$bizdate${yyyymmdd}$cyctime$[yyyymmddhh24miss]的参数定义和业务日期为2025-10-16时的预览结果。

image

image

若基准时间的参数返回值不满足要求,也可以通过${...}$[...]进行自定义时间参数,自定义时间参数是在两种基准时间的基础上进行变换,支持以下几种方式:

重要

通过自定义方式对调度参数进行赋值时,需注意区分两种括号的格式{...}和[...],两种模式的基准值不同,返回的参数值也截然不同,避免造成生产数据错误。

自定义时间参数

DataWorks支持通过${...}$[...]来获取业务时间和定时时间,并支持通过以下几种类型,对时间进行灵活变换,以符合业务需要。以节点配置的调度时间为天调度,调度时间02:30:45为例。假设业务日期为20251031,以下是基准时间:

  • 业务日期${yyyymmdd},以20251031为例。

  • 定时时间$[yyyymmddhh24miss],以20251101023045为例。

    重要

    定时时间为预设的调度时间,在任务实例化时已固定。如任务实例因资源受限或上游节点状态等原因延迟运行,定时时间不会随着实例实际运行时间而改变。

${...}$[...] 核心区别

首先了解两者的核心区别。${...}$[...] 两种格式在时间基准和计算能力上存在本质区别,混用这两种格式可能导致数据错误。

对比维度

${...} (基于业务日期)

$[...] (基于定时时间)

时间基准

业务日期(T-1)

定时时间(T)

时间精度

(年月日)

(年月日时分秒)

偏移计算能力

支持对 年、月、周、天 进行偏移计算。

支持对 天、小时、分钟 进行偏移计算。

核心限制

不支持时、分、秒等更小时间单位的格式化与偏移计算。

不支持通过 $[yyyy±N]$[mm±N] 的语法直接对年、月进行偏移,需借助 add_months 函数。

默认等价

${yyyymmdd} 等价于 $bizdate

$[yyyymmddhh24miss] 等价于 $cyctime

时间格式化

使用大括号${...}$[...],结合yyyyyymmdd自定义组合生成时间参数,获取业务日期前后多少年、月、天。

代码

描述

${...}(基于业务日期)

$[...] (基于定时时间)

赋值方式

结果

赋值方式

结果

yyyy

4位年份

${yyyy}

2025

$[yyyy]

2025

mm

2位月份

${mm}

10

$[mm]

11

dd

2位日期

${dd}

31

$[dd]

01

hh24

24小时制小时

不支持(精度为天)

-

$[hh24]

02

hh / hh12

12小时制小时

-

$[hh]

02

mi

分钟

-

$[mi]

30

ss

-

$[ss]

45

yyyymm

取年月

${yyyymm}

202510

$[yyyymm]

202511

yyyy-mm-dd

格式化为用“-”拼接

${yyyy-mm-dd}

2025-10-31

$[yyyy-mm-dd]

2025-11-01

yyyy-mm-dd hh24:mi:ss

格式化为用“-”拼接,并带时分秒

不支持(精度为天)

-

支持方式见字符串拼接:方案2

偏移计算

偏移计算是动态参数的核心,可基于业务日期定时时间进行前后加减。如在时间基准的基础上实现获取前后N年、月、日,或N小时、分钟(小时分钟仅支持定时时间)的时间计算。${...}$[...]由于时间基准的精度不同,可支持的范围也不一样。

  1. ${...} 模式的偏移计算

    • 核心能力:支持对年、月、周、天进行整数偏移。

      重要

      不支持时、分的偏移计算。即不支持${yyyy-mm-dd-1/24}等用法。

    • 语法:${<时间格式><±N>},N对应时间格式的最小单位。如格式为yyyymm,则N的单位对应mm(月);如格式为yyyymmdd,则格式对应dd(天)。

      日期加减周期

      偏移单位

      获取方式

      举例

      前/后N

      ${yyyy±N}${yy±N}

      取上一年:${yyyy-1}

      前/后N

      ${yyyymm±N}

      取上个月:${yyyymm-1}

      前/后N

      ${yyyymmdd±7*N}

      取上周:${yyyymmdd-7*1}

      前/后N

      ${yyyymmdd±N}

      取前天:${yyyymmdd-1}

  2. $[...] 模式的偏移计算

    • 核心能力:支持对天、小时、分钟进行分数偏移。

      重要

      $[...]无法根据$[yyyy-N]$[mm-N]时间格式获取多少年前、多少月前的时间数据。如需对年月进行偏移计算,需用 add_months 函数来支持年月偏移。

    • 语法:$[<时间格式><±N>] ,其中小时偏移使用N/24 ,分钟偏移使用N/24/60,N为需要偏移的小时或分钟数。

      需求

      偏移单位

      获取方式

      举例

      前/后 N 年

      $[add_months(yyyymmdd,12*N)] (后N年)
      $[add_months(yyyymmdd,-12*N)] (前N年)

      取上一年:$[add_months(yyyymmdd,-12)]

      前/后 N 月

      $[add_months(yyyymmdd,N)] (后N月)
      $[add_months(yyyymmdd,-N)] (前N月)

      取上个月:$[add_months(yyyymmdd,-1)]

      前/后 N 周

      $[yyyymmdd±7*N]

      取上周:$[yyyymmdd±7*1]

      前/后 N 天

      $[yyyymmdd±N]

      取昨天:$[yyyymmdd-1]

      前/后 N 小时

      小时

      获取该时间数据包含如下方式:

      • $[hh24miss±N/24]$[hh24±N/24]

      • $[自定义时间格式±N/24]

      不同时间格式的取前一个小时:

      • 取月:$[mm-1/24]

      • 取年:$[yyyy-1/24]

      • 取年月:$[yyyymm-1/24]

      • 取年月日:$[yyyymmdd-1/24]

      • 取前一天且前一小时:$[yyyymmdd-1-1/24]

      前/后 N 分钟

      分钟

      获取该时间数据包含如下方式:

      • $[hh24miss±N/24/60]

      • $[yyyymmddhh24miss±N/24/60]

      • $[mi±N/24/60]

      • $[自定义时间格式±N/24/60]

      不同时间格式的取定时时间的前15分钟:

      • $[yyyy-15/24/60]

      • $[yyyymm-15/24/60]

      • $[yyyymmdd-15/24/60]

      • $[hh24-15/24/60]

      • $[mi-15/24/60]

      复杂组合偏移

      天+小时

      $[yyyymmdd±N±M/24],N为天偏移量,M为小时偏移量。

      示例:获取前一天的前一小时 → $[yyyymmdd-1-1/24]

      说明
      • 执行小时分钟的偏移计算时,可能存在跨天问题。跨天时间的参数处理方式,详情请参见调度参数往前取一个小时,如何处理跨天参数替换的问题

      • 月末日期执行月偏移计算时,若目标月份没有对应日期,结果将自动校准为该月的最后一天。例如:当前为2025-03-31,执行减1月偏移操作,由于2月没有31号,取值为2025-02-28。

通过引擎函数二次变换

当调度参数的内置格式化和偏移无法直接生成最终需要的值时(如获取上月的最后一天),可通过使用目标节点的计算引擎内置的函数或通过赋值节点在调用参数时,对时间参数进行二次变换。

参考:调度参数返回值二次处理的典型场景

字符串拼接

此方法用于构建内置语法不支持的、但有规律的日期字符串。它将调度参数生成的日期部分与固定的常量字符串进行组合。

案例1:动态获取每月的第一天。

  • 场景:无论任务在哪天运行,都需要一个代表当月第一天的字符串,格式为 yyyymm01

  • 实现:

    1. 提取年月部分:使用 ${yyyymm} 获取当前业务日期的年月部分(例如,如果业务日期是 20231027,则结果为 202310)。

    2. 拼接常量:将提取出的年月与字符串 '01' 进行拼接。

    3. 参数调用:first_day_of_month=${yyyymm}01

  • 结果:当任务运行时,${first_day_of_month} 将被替换为 20231001

案例2:获取yyyy-mm-dd hh24:mi:ss格式的时间。

  • 场景:获取一个yyyy-mm-dd hh24:mi:ss格式的时间,如:2023-11-01 02:30:45

  • 实现:

    1. 设置两个参数:分别为datetime1datetime2,并且分别赋值为datetime1=$[yyyy-mm-dd]datetime2=$[hh24:mi:ss-1/24/60]

    2. 拼接参数:将datetime1datetime2通过空格拼接。

    3. 参数调用:pt=${datetime1} ${datetime2}

  • 结果:当任务运行时,${datetime1} ${datetime2}将被替换为:2023-11-01 02:30:45

系统内置调度参数

DataWorks支持下表的系统参数,可用于设置调度参数的取值。但该方式灵活性差,时间格式固定,建议优先使用支持灵活变换的自定义时间参数。

内置参数

定义

$bizdate

业务日期,格式为yyyymmdd,与自定义参数${yyyymmdd}取值一致。

该参数的应用较为广泛,日常调度中默认任务预期运行时间的前一天为业务日期。

$cyctime

任务的定时时间,格式为yyyymmddhh24miss,与自定义参数$[yyyymmddhh24miss]取值一致。

$gmtdate

当前日期,格式为yyyymmdd

该参数默认取当天日期,执行补数据操作时输入的日期为业务日期+1

$bizmonth

业务月份,格式为yyyymm

  • 如果业务日期的月份与当前月份一致,则$bizmonth=业务日期月份-1

  • 如果业务日期的月份与当前月份不一致,则$bizmonth=业务日期月份

$jobid

任务所属的业务流程ID。

$nodeid

节点ID。

$taskid

节点产生的实例ID。

附录

补数据时的参数替换

任务提交至运维中心后,可以通过执行补数据操作批量生成并执行指定日期范围内的历史任务实例,以完成数据的修复、回补或回溯分析。

  • 业务日期($bizdate):补数据时选择的业务日期和$bizdate的替换结果保持一致。若调度参数使用${...}自定义格式,其基准时间即为选中的日期,随后根据指定的时间表达式进行变换。

  • 定时时间($cyctime):执行补数据时,$cyctime替换结果为选择的业务日期+1天。

    例如,补数据选择的业务日期为20250315,则执行补数据时,$cyctime参数的替换结果为20250316000000。若调度参数使用$[...]格式,其基准时间为选中的业务日期+1,随后根据指定的时间表达式进行变换。

调度参数与业务日期、定时时间、实际运行时间的关系

关系类别

说明及示例

调度参数与实际运行时间的关系。

调度参数替换值在实例生成时已确定,因此,调度参数的替换值不会随着实例实际运行时间的改变而发生变化。

调度参数与任务定时时间的关系。

当调度参数设置为$[]时,参数的替换值由实例的定时时间决定,即由节点调度配置的调度时间决定。

image

例如,当前节点为小时调度节点,并且设置定时调度时间为00:00~23:59,每小时调度一次,则:

  • 第一个小时实例定时时间为0点,小时的参数取值为00

  • 第二个小时实例定时时间为1点,小时的参数取值为01

调度参数与业务日期、定时时间的关系。

image

关于夏令时说明

DataWorks可保障在进入和退出夏令时当天,任务能够正确运行。进入与退出夏令时切换产品侧的解决方案详情,请参见相关文档场景:夏令时切换对调度任务运行的影响。为避免夏令时切换对您任务执行造成额外理解成本,建议实施夏令时的地域优先查看此文档。

自定义参数取值差异对比

本文以ODPS SQL节点为例,假设任务的调度时间为20250720103000,展示${…}$[…]参数的时间取值配置,具体如下表。

时间取值

${…}参数

$[…]参数

取年份:2025

  • 调度参数赋值:datetime=${yyyy}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025

  • 调度参数赋值:datetime=$[yyyy]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025

取年份:25

  • 调度参数赋值:datetime=${yy}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=25

  • 调度参数赋值:datetime=$[yy]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=25

取年份:2024

  • 调度参数赋值:datetime=${yyyy-1}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2024

  • 调度参数赋值:datetime=$[add_months(yyyymmdd,-12)]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2024

取月份:07

  • 调度参数赋值:datetime=${mm}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=07

  • 调度参数赋值:datetime=$[mm]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=07

取日期(天):20

  • 调度参数赋值:datetime=${dd}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=20

  • 调度参数赋值:datetime=$[dd]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=20

取日期:20250620

  • 调度参数赋值:datetime=${yyyy-mm-dd-29}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025-06-20

重要

此方式需考虑月份天数,不推荐使用,建议通过$[]方式获取上月的同一日期。

  • 调度参数赋值:datetime=$[add_months(yyyymmdd,-1)]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025-06-20

取日期:20250719

  • 调度参数赋值:datetime=${yyyy-mm-dd}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025-07-19

  • 调度参数赋值:datetime=$[yyyy-mm-dd-1]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2025-07-19

取日期:20240720

  • 调度参数赋值:datetime=${yyyy-mm-dd-364}

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2024-07-20

重要

此方法需考虑闰年,不推荐使用,建议通过$[]方式获取上一年的同一日期。

  • 调度参数赋值:datetime=$[add_months(yyyymmdd,-12)]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=2024-07-20

取时间:10:30:00

不支持

  • 调度参数赋值:datetime=$[hh24:mi:ss]

  • 代码引用:pt=${datetime}

  • 参数替换结果:pt=10:30:00

取时间:2025-07-20 10:30:00

不支持

  • 调度参数赋值:datetime1=$[yyyy-mm-dd] datetime2=$[hh24:mi:ss]

    说明

    您需要自定义两个参数datetime1datetime2,两个参数间使用一个空格分隔。

  • 代码引用:pt=${datetime1} ${datetime2}

  • 参数替换结果:

    • datetime1=$[yyyy-mm-dd]=2025-07-20

    • datetime2=$[hh24:mi:ss]=10:30:00

    • pt=2025-07-20 10:30:00

取时间:2025-07-20 10:29:00

不支持

  • 调度参数赋值:datetime1=$[yyyy-mm-dd] datetime2=$[hh24:mi:ss-1/24/60]

    说明

    您需要自定义两个参数datetime1datetime2,两个参数间使用一个空格分隔。

  • 代码引用:pt=${datetime1} ${datetime2}

  • 参数替换结果:

    • datetime1=$[yyyy-mm-dd]=2025-07-20

    • datetime2=$[hh24:mi:ss-1/24/60]=10:29:00

    • pt=2025-07-20 10:29:00

取时间:2025-07-20 09:30:00

不支持

  • 调度参数赋值:datetime1=$[yyyy-mm-dd] datetime2=$[hh24:mi:ss-1/24]

    说明

    您需要自定义两个参数datetime1datetime2,两个参数间使用一个空格分隔。

  • 代码引用:pt=${datetime1} ${datetime2}

  • 参数替换结果:

    • datetime1=$[yyyy-mm-dd]=2025-07-20

    • datetime2=$[hh24:mi:ss-1/24]=09:30:00

    • pt=2025-07-20 09:30:00

取前一天时间,精确到秒,且年月日与时分秒之间无空格:

2025071910:30:00

不支持

  • 调度参数赋值:datetime=$[yyyymmddhh24miss-1]

  • 代码引用:pt=${datetime}

  • 参数替换结果:

    • datetime=$[yyyymmddhh24miss-1]=2025071910:30:00

    • pt=2025071910:30:00

取前一天时间,精确到秒,且年月日与时分秒之间有空格:

20250719 10:30:00

不支持

  • 调度参数赋值:datetime1=$[yyyymmdd-1] datetime2=$[hh24:mi:ss]

    说明

    您需要自定义两个参数datetime1datetime2,两个参数间使用一个空格分隔。

  • 代码引用:pt=${datetime1} ${datetime2}

  • 参数替换结果:

    • datetime1=$[yyyymmdd-1]=20250719

    • datetime2=$[hh24:mi:ss]=10:30:00

    • pt=20250719 10:30:00

相关文档