当前位置: 首页 > ds >正文

JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题

JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题

文章目录

  • JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题
  • 前言
  • 一、基于时间点对时间分割
  • 二、引入断点概念
  • 总结


前言

前提概要

从SAP拉取的组织的情况下:由于组织会具有多个子集信息,在SAP中存储。但是业务中只有一张组织表,同时存储SAP的子集信息。

多段的时间点如何赋值到主表中就成了问题。

SAP的数据中:组织的主数据中开始结束时间一定时连续的。但是由于业务的不精练,某些业务人员会对数据进行误操作,导致从SAP拉取的数据,在基于时间点的时间分割就会出现问题。

当然由于代码过于老旧,2年前的,而且从来都没有人想要去维护,导致我头疼不已。目前为止已经丢失了20几个过去组织数据,30余个岗位信息。


一、基于时间点对时间分割

思路:将所有的时间节点存储到Set集合中,时间点之间进行遍历。一定会得到最小线段,然后去赋值。 这样一定是两两存在,而且数据不会错乱。

但是这样真的对吗?
如果某一天的数据维护成了2025-05-04/2025-05-04,这是一个点的数据,这个点的数据时不能赋值到任意的时间段的。而且时间点的存在会导致奇数节点的存在,不能两两匹配。

二、引入断点概念

把A->A的天当作断点引入。
针对断点进行单独处理,必须是单独的,并且非常不建议连同一下个节点一起处理。

记录breakPointSet和timeSet。
如果当前节点是断点,则生成一条自己到自己的
如果下一个节点是断点,则生成两条:当前到断点-1天,断点到断点。
最终补一个数据,此数据是由于数据的不完全维护导致。

没有维护完整的子集数据。例如今天是2025-05-04,只维护了stdate到2025-05-01的数据,而没有维护9999-12-31,导致数据中多出一个结点。

代码如下(示例):


@SpringBootTest
public class UnitUpd {/*** 首先的一个大前提是,时间一定存在一个连续的*/@Testvoid unitLogic() {List<String> timeList = new ArrayList<>();//样式1:末尾时间是断点
//        timeList.add("2025-01-01/2025-01-04");
//        timeList.add("2025-01-05/2025-01-05");
//        timeList.add("2025-01-06/2025-01-10");
//        timeList.add("2025-01-01/2025-01-03");//样式2 数据不齐全
//        timeList.add("2025-01-01/2025-01-04");
//        timeList.add("2025-01-05/2025-01-05");
//        timeList.add("2025-01-06/2025-01-10");
//        timeList.add("2025-01-01/2025-01-08");//样式3
//        timeList.add("2025-01-01/2025-01-04");
//        timeList.add("2025-01-05/2025-01-05");
//        timeList.add("2025-01-06/2025-01-10");
//        timeList.add("2025-01-01/2025-01-10");
//
// 样式4
//        timeList.add("2025-01-03/2025-01-03");
//        timeList.add("2025-01-04/2025-01-04");
//        timeList.add("2025-01-05/2025-01-10");
//        timeList.add("2025-01-01/2025-01-03");
//        timeList.add("2025-01-01/2025-01-04");Set<String> timeSet = new TreeSet<>();Set<String> breakPointSet = new TreeSet<>();for (String time : timeList) {final String[] split = time.split("\\/");if (split[0].equals(split[1])) {breakPointSet.add(split[0]);}timeSet.add(split[0]);timeSet.add(split[1]);}System.out.println("breakPointSet:" + breakPointSet);System.out.println("timeSet:" + timeSet);List<String> resultList = new ArrayList<>();final Iterator<String> iterator = timeSet.iterator();String pre = null;// todo 上一个处理的节点,为填充数据做准备while (iterator.hasNext()) {final String now = iterator.next();if (breakPointSet.contains(now)) {resultList.add(now + "/" + now);pre = now;continue;}final boolean hasNext = iterator.hasNext();if (hasNext) { //有下一个节点String next = iterator.next();if (breakPointSet.contains(next)) { // todo 并且只处理下一个节点是断点的情况final String preDay = LocalDate.parse(next).minusDays(1).format(DateTimeFormatter.ISO_DATE);resultList.add(now + "/" + preDay);resultList.add(next + "/" + next);} elseresultList.add(now + "/" + next);pre = next;} else { //没有下一个节点的时候,判断自身节点是不是断点if (breakPointSet.contains(now)) {resultList.add(now + "/" + now);} else {final String preDay = LocalDate.parse(pre).plusDays(1).format(DateTimeFormatter.ISO_DATE);System.out.println("补充了数据" + preDay);resultList.add(preDay + "/" + now);}}}System.out.println("最终的数据:" + resultList);}
}

总结

力扣还是得刷

http://www.xdnf.cn/news/3999.html

相关文章:

  • 解释一下NGINX的反向代理和正向代理的区别?
  • 【C++重载操作符与转换】下标操作符
  • Android学习总结之事件分发机制篇
  • Java大厂面试:Java技术栈中的核心知识点
  • 25.5.4数据结构|哈夫曼树 学习笔记
  • 深度学习在自动驾驶车辆车道检测中的应用
  • 硬件工程师面试常见问题(13)
  • 一个整数n可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数,详解
  • 5.4学习记录
  • 洛谷 P2473 [SCOI2008] 奖励关
  • TS 类型别名
  • ES6入门---第三单元 模块一:类、继承
  • 【操作系统】死锁
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • 【C语言入门级教学】VS使用调试技巧1
  • 算法笔记.求约数
  • 303.整数拆分
  • Seata TCC 实战笔记:从零搭建分布式事务 Demo (含源码)
  • Linux的时间同步服务器
  • 【LLM】deepseek R1之GRPO训练笔记(持续更新)
  • 【TF-BERT】基于张量的融合BERT多模态情感分析
  • 代码随想录算法训练营Day44
  • PyTorch_张量索引操作
  • Spring Cloud Gateway路由+断言+过滤
  • Flask + SQLite 简单案例
  • 位置权限关掉还能看到IP属地吗?全面解析定位与IP的关系
  • 腾讯云服务器技术全景解析:从基础架构到行业赋能​
  • React-router v7 第七章(导航)
  • 如何使用VSCode编写C、C++和Python程序
  • ES类迁移方法