历史版本10 :日期序列循环取数(日期序列在循环容器外生成) 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

1)API 接口中,有大量数据,且可通过开始日期和结束日期参数取出数据。

1768461462335694.png

2)数据库表中存在大量数据,且存在日期字段,若一次性取出,会占用过多数据库内存或网络带宽,影响其他业务。

1.2 实现思路

场景模拟-待取出数据:

1768461541868732.png

场景模拟-思路说明:

1768461664537426.png

将日期字段分段,每次取出一个时间段的数据(本文示例中,每个时间段相差 4 天),直至遍历完所有日期序列取出所有数据。

取出数据时的筛选条件:时间段的开始日期<=入库日期<时间段的结束日期

注:日期序列为 SparkSQL节点生成的。

循环次数
日期序列-开始日期日期序列-结束日期说明
第一次循环

2026-01-01

SparkSQL节点生成的,为源表最小日期值

2026-01-05取出该时间段内的数据
第二次循环2026-01-052026-01-09
第三次循环2026-01-092026-01-13
第四次循环2026-01-13

2026-01-16

SparkSQL节点生成的,为源表最大日期值+1天;不能为源表最大日期值,否则最后一天的数据在循环时取不到

取出该时间段内的数据,已遍历完所有日期序列

结束循环

2. 操作步骤编辑

2.1 生成起始日期和结束日期

1)新建定时任务,拖入「数据转换」节点,进入「数据转换节点。

2)拖入 SparkSQL 节点,写 SQL 语句生成起始日期和结束日期。如下图所示:

起始日期:本月第一天,日期格式为 yyyy-mm-dd,本文示例中,值为 2026-01-01 。

结束日期:当天日期+1天(当天日期为 2026-01-15,源表中最大日期值为 2026-01-15),日期格式为 yyyy-mm-dd

  • 因为后续取数时,筛选条件为时间段的开始日期<=入库日期<时间段的结束日期,如果最后一次循环,时间序列的结束日期设置为源表的最大日期值,那么最后一天的数据在循环取数时取不到。

注:该 SQL 生成的起始日期和结束日期为动态的,用户根据实际情况调整SQL语句。

SELECT 
  CONCAT(LEFT('${cyctime}',7),"-01") as s_date,
  DATE_ADD(CAST(LEFT('${cyctime}',10) AS DATE), 1) as e_date

1768463781580424.png

3)拖入「参数输出算子,将起始日期和结束日期输出为参数。如下图所示:

1768464014966525.png

2.2 生成日期序列

1)拖入一个「数据转换节点,进入数据转换节点。

2)拖入 SparkSQL 节点,生成日期序列;每个时间段的日期相差4天,最小日期为 s_date,最大日期为 e_date。

1768464158789135.png

WITH date_params AS (
  SELECT 
    cast('${s_date}' as date) as start_date,
    cast('${e_date}' as date) as end_date
),

-- 使用整数序列替代
numbers AS (
  SELECT explode(sequence(
    cast(0 as int),  -- 起始值
    cast(ceil(datediff(end_date, start_date)/4.0) as int),  -- 结束值
    cast(1 as int)   -- 步长
  )) as seq
  FROM date_params
),

-- 生成日期对
date_pairs AS (
  SELECT 
    date_add(d.start_date, n.seq*4) as date_from,
    LEAST(date_add(d.start_date, (n.seq+1)*4), d.end_date) as date_to
  FROM date_params d
  CROSS JOIN numbers n
  WHERE date_add(d.start_date, n.seq*4) < d.end_date
)

SELECT date_from, date_to 
FROM date_pairs 
ORDER BY date_from

1768464223534630.png

3)拖入「参数输出算子,将日期序列的起始值和结束值输出为参数。如下图所示:

由于该值为日期,需要开启「闭包符按钮,给参数值加引号,后续节点引用该参数值时,SQL语句中无需再加引号。

1768464321781248.png

2.3 循环容器设置

拖入「循环容器节点,循环方式选择「遍历循环,遍历对象勾选日期序列的起始值和结束值参数。如下图所示:

1768464440387893.png

2.4 取数

1)「循环容器」内拖入「数据同步节点,取出日期序列对应的数据。如下图所示:

29.png

2)将数据写入到目标表中。如下图所示:

30.png

2.5 效果查看

运行定时任务后,可看到取出所有数据。目标表数据如下图所示:

1768464730854759.png

最后一次循环的执行详情为:

1768464869271189.png