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);}
}
总结
力扣还是得刷