1. 概述
1.1 应用场景
1)API 接口中,有大量数据,且可通过开始日期和结束日期参数取出数据。

2)数据库表中存在大量数据,且存在日期字段,若一次性取出,会占用过多数据库内存或网络带宽,影响其他业务。
1.2 实现思路
场景模拟-待取出数据:

场景模拟-思路说明:

将日期字段分段,每次取出一个时间段的数据(本文示例中,每个时间段相差 4 天),直至遍历完所有日期序列取出所有数据。
取出数据时的筛选条件:时间段的开始日期<=入库日期<时间段的结束日期
注:日期序列为 SparkSQL节点生成的。
| 循环次数 | 日期序列-开始日期 | 日期序列-结束日期 | 说明 |
|---|---|---|---|
| 第一次循环 | 2026-01-01 SparkSQL节点生成的,为源表最小日期值 | 2026-01-05 | 取出该时间段内的数据 |
| 第二次循环 | 2026-01-05 | 2026-01-09 | |
| 第三次循环 | 2026-01-09 | 2026-01-13 | |
| 第四次循环 | 2026-01-13 | 2026-01-16 SparkSQL节点生成的,为源表最大日期值+1天;不能为源表最大日期值,否则最后一天的数据在循环时取不到 | 取出该时间段内的数据,已遍历完所有日期序列 结束循环 |
2. 操作步骤
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「日期序列循环取数(日期序列在循环容器外生成)」。
提示: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

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

2.2 生成日期序列
1)拖入一个「数据转换」节点,进入「数据转换」节点。
2)拖入 SparkSQL 节点,生成日期序列;每个时间段的日期相差4天,最小日期为 s_date,最大日期为 e_date。

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

3)拖入「参数输出」算子,将日期序列的起始值和结束值输出为参数。如下图所示:
由于该值为日期,需要开启「闭包符」按钮,给参数值加引号,后续节点引用该参数值时,SQL语句中无需再加引号。

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

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

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

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

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

3. 内容扩展
SELECT explode(sequence(to_date('${s_date}'), to_date('${e_date}'), interval 1 day)) as date
可根据 s_date 和 e_date,生成一列日期值,日期最小值为s_date ,最大值为e_date,日期间隔为1天。
可取出日期时间对应的数据。

