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

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);}
}

总结

力扣还是得刷

相关文章:

  • C语言 指针(5)
  • 不定长滑动窗口(求最短/最小)
  • 【quantity】11 体积单位模块(volume.rs)
  • Kubernetes(k8s)学习笔记(五)--部署Ingress实现域名访问和负载均衡
  • C++23 std::tuple与其他元组式对象的兼容 (P2165R4)
  • 每天五分钟深度学习框架PyTorch:基于Dataset封装自定义数据集
  • 用哈希表封装出unordered_set/_map
  • MySQL基础关键_007_DQL 练习
  • MOS管极间电容参数学习
  • 华中科技大学系统结构慕课部分答案
  • 250504_VsCode使用
  • Mybatis执行流程知多少
  • WEB 前端学 JAVA(二)Java 的发展与技术图谱简介
  • Linux网络编程:套接字
  • Spring AI支持的聊天模型全方位比较与分析
  • 利用n8n、DeepSeek、AI Agent、子工作流生成统计图
  • PyTorch_张量形状操作
  • 常用命令集合
  • 55、【OS】【Nuttx】编码规范解读(三)
  • 比较 TensorFlow 和 PyTorch
  • 人民日报今日谈:坚决克服麻痹思想,狠抓工作落实
  • 新加坡国会选举投票抽样结果公布,执政党已获超半数议席
  • 三亚回应“买水果9斤变6斤”:反映属实,拟对流动摊贩罚款5万元
  • 保持高位运行,今天全国铁路预计发送旅客1800万人次
  • 中青报:“爸妈替我在线相亲”,助力还是越界?
  • 对谈|“对工作说不”是不接地气吗?