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

有最大offset限制的日期范围API如何拆分查询子范围获取全量数据?

递归拆分日期区间实现方案

核心思路

  • 前置判断逻辑:对任意日期区间,先请求offset=1000&limit=20的接口,通过返回结果条数判断区间数据量是否超过可拉取上限(1020条)
  • 递归终止条件:
    1. 请求返回结果条数 < 20,说明当前区间数据总量≤1020,可通过正常翻页拉取全量数据,无需继续拆分
    2. 日期区间已经拆分到最小粒度(默认按天拆分,可根据业务调整为小时/分钟),无法继续拆分
  • 拆分规则:将当前日期区间按时间二等分,两个子区间首尾重叠,避免中间时间点的数据遗漏

JavaScript 实现代码

首先封装基础工具函数:

// 日期格式化:转成 YYYY-MM-DD 格式
function formatDate(date) {
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  return `${year}-${month}-${day}`
}
// 计算两个日期相差的天数
function getDayDiff(from, to) {
  const fromTime = new Date(from).getTime()
  const toTime = new Date(to).getTime()
  return Math.ceil((toTime - fromTime) / (1000 * 60 * 60 * 24))
}
// 获取中间日期
function getMiddleDate(from, to) {
  const fromTime = new Date(from).getTime()
  const toTime = new Date(to).getTime()
  const middleTime = fromTime + Math.floor((toTime - fromTime) / 2)
  return formatDate(new Date(middleTime))
}
// 封装API请求,返回offset=1000&limit=20的结果条数
async function fetchResultCount(from, to) {
  const url = `https://api.com/?from=${from}&to=${to}&limit=20&offset=1000`
  const res = await fetch(url)
  const data = await res.json()
  // 假设接口返回的结果数组放在data.list里,根据实际接口结构调整
  return data.list.length
}

核心递归拆分函数:

async function splitDateInterval(from, to) {
  const result = []
  // 边界校验:起始日期大于结束日期直接返回空
  if (new Date(from) > new Date(to)) return result
  // 第一步:判断当前区间是否需要拆分
  const count = await fetchResultCount(from, to)
  // 无需拆分,直接加入结果
  if (count < 20) {
    result.push([from, to])
    return result
  }
  // 已经是最小粒度(间隔1天),无法继续拆分,直接加入结果
  const dayDiff = getDayDiff(from, to)
  if (dayDiff <= 1) {
    result.push([from, to])
    return result
  }
  // 第二步:拆分区间为两等份,递归处理
  const middleDate = getMiddleDate(from, to)
  // 左区间:from 到 中间日期
  const leftRes = await splitDateInterval(from, middleDate)
  // 右区间:中间日期 到 to,首尾重叠避免数据遗漏
  const rightRes = await splitDateInterval(middleDate, to)
  // 合并结果返回
  return [...leftRes, ...rightRes]
}

使用示例

// 调用示例
splitDateInterval('2021-07-20', '2021-07-24').then(res => {
  console.log(res)
  // 输出格式示例:[["2021-07-20","2021-07-22"],["2021-07-22","2021-07-24"]],如果每个子区间数据还是超量会继续拆分到符合要求
})

优化建议

  • 可根据业务需求调整最小拆分粒度,比如数据量极大的场景可以拆分为小时级
  • 可以添加请求缓存,避免同一个区间重复请求接口
  • 递归深度过大时可以改写成迭代实现,避免栈溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:15:03