反馈已提交

网络繁忙

日期序列循环取数(日期序列在循环容器外生成)

  • 文档创建者:Roxy
  • 历史版本:13
  • 最近更新:Wendy123456 于 2026-01-19
  • 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. 操作步骤

    FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「日期序列循环取数(日期序列在循环容器外生成)」。

    icon提示:
    相同效果的不同方案请参见:日期序列循环取数(日期序列在循环容器内生成);大数据量取数方案请参见:大数据量取数方案

    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

    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天。

    可取出日期时间对应的数据。

    1768466076934857.png





    附件列表


    主题: 数据开发-定时任务
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭



    AI

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持