1、增加时间范围取值
This commit is contained in:
parent
1c56a38f81
commit
95c00610f6
Binary file not shown.
Binary file not shown.
@ -201,6 +201,7 @@ public class ProductionDataSyncServiceImpl implements DataSyncService {
|
|||||||
boolean hasMore;
|
boolean hasMore;
|
||||||
RDSAPI rdsapi = null;
|
RDSAPI rdsapi = null;
|
||||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
||||||
@ -230,8 +231,8 @@ public class ProductionDataSyncServiceImpl implements DataSyncService {
|
|||||||
|
|
||||||
for (int i = 0; i < timeRanges.size(); i++) {
|
for (int i = 0; i < timeRanges.size(); i++) {
|
||||||
Date[] range = timeRanges.get(i);
|
Date[] range = timeRanges.get(i);
|
||||||
String startDate = simpleDateFormat.format(range[0]);
|
String startDate = simpleDateFormat2.format(range[0]);
|
||||||
String endDate = simpleDateFormat.format(range[1]);
|
String endDate = simpleDateFormat2.format(range[1]);
|
||||||
|
|
||||||
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
||||||
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
||||||
@ -345,8 +346,11 @@ public class ProductionDataSyncServiceImpl implements DataSyncService {
|
|||||||
// 如果时间字段存在,添加时间范围条件
|
// 如果时间字段存在,添加时间范围条件
|
||||||
if (timeField != null && !timeField.isEmpty()) {
|
if (timeField != null && !timeField.isEmpty()) {
|
||||||
conditionBuilder.append(" AND ")
|
conditionBuilder.append(" AND ")
|
||||||
.append(timeField)
|
.append(timeField).append(" >= ?")
|
||||||
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
.append(" AND ")
|
||||||
|
.append(timeField).append(" < ?")
|
||||||
|
.append(" ORDER BY ").append(timeField);
|
||||||
|
//.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
||||||
if (jezd != null && !jezd.isEmpty()) {
|
if (jezd != null && !jezd.isEmpty()) {
|
||||||
conditionBuilder.append(", " + jezd + " ");
|
conditionBuilder.append(", " + jezd + " ");
|
||||||
}
|
}
|
||||||
@ -354,8 +358,12 @@ public class ProductionDataSyncServiceImpl implements DataSyncService {
|
|||||||
}
|
}
|
||||||
} else if (timeField != null && !timeField.isEmpty()) {
|
} else if (timeField != null && !timeField.isEmpty()) {
|
||||||
// 没有分区字段,但时间字段存在,使用时间范围条件
|
// 没有分区字段,但时间字段存在,使用时间范围条件
|
||||||
conditionBuilder.append(timeField)
|
/*conditionBuilder.append(timeField)
|
||||||
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");*/
|
||||||
|
conditionBuilder.append(timeField).append(" >= ?")
|
||||||
|
.append(" AND ")
|
||||||
|
.append(timeField).append(" < ?")
|
||||||
|
.append(" ORDER BY ").append(timeField);
|
||||||
if (jezd != null && !jezd.isEmpty()) {
|
if (jezd != null && !jezd.isEmpty()) {
|
||||||
conditionBuilder.append(", " + jezd + " ");
|
conditionBuilder.append(", " + jezd + " ");
|
||||||
}
|
}
|
||||||
@ -455,61 +463,73 @@ public class ProductionDataSyncServiceImpl implements DataSyncService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将时间范围拆分为多个区间,确保区间连续且不重叠
|
* 将时间范围拆分为多个区间,确保区间连续(下一个区间的开始时间 = 上一个区间的结束时间)且无重叠
|
||||||
* @param startDate 开始时间(yyyy-MM-dd格式,时间部分为00:00:00)
|
* 所有日期均强制转换为 yyyy-MM-dd 格式(时间部分固定为 00:00:00)
|
||||||
* @param endDate 结束时间(yyyy-MM-dd格式,时间部分为00:00:00)
|
* @param startDate 开始时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00)
|
||||||
* @param daysInterval 间隔天数
|
* @param endDate 结束时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00)
|
||||||
* @return 时间区间列表,每个区间的结束时间调整为23:59:59以确保覆盖完整日期
|
* @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08)
|
||||||
|
* @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式
|
||||||
*/
|
*/
|
||||||
private static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
public static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
||||||
List<Date[]> ranges = new ArrayList<>();
|
// 1. 入参合法性校验:避免无效区间或负间隔
|
||||||
|
if (startDate == null || endDate == null) {
|
||||||
|
throw new IllegalArgumentException("开始时间和结束时间不可为 null");
|
||||||
|
}
|
||||||
|
if (daysInterval < 1) {
|
||||||
|
throw new IllegalArgumentException("间隔天数必须大于等于 1");
|
||||||
|
}
|
||||||
|
// 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00)
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响)
|
||||||
calendar.setTime(startDate);
|
calendar.setTime(startDate);
|
||||||
|
Date currentStart = calendar.getTime();
|
||||||
|
|
||||||
// 调整结束时间以包含完整日期
|
|
||||||
Calendar endCal = Calendar.getInstance();
|
Calendar endCal = Calendar.getInstance();
|
||||||
|
setTimeToStartOfDay(endCal);
|
||||||
endCal.setTime(endDate);
|
endCal.setTime(endDate);
|
||||||
endCal.set(Calendar.HOUR_OF_DAY, 23);
|
Date finalEnd = endCal.getTime();
|
||||||
endCal.set(Calendar.MINUTE, 59);
|
// 额外校验:开始时间不能晚于结束时间
|
||||||
endCal.set(Calendar.SECOND, 59);
|
if (currentStart.after(finalEnd)) {
|
||||||
endCal.set(Calendar.MILLISECOND, 999);
|
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
||||||
Date adjustedEndDate = endCal.getTime();
|
}
|
||||||
|
List<Date[]> ranges = new ArrayList<>();
|
||||||
while (calendar.getTime().before(adjustedEndDate)) {
|
// 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束”
|
||||||
// 区间开始时间(当前日期的00:00:00)
|
while (true) {
|
||||||
Date rangeStart = calendar.getTime();
|
// 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08)
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, daysInterval);
|
||||||
// 增加间隔天数-1天,然后设置为23:59:59作为区间结束时间
|
setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00
|
||||||
calendar.add(Calendar.DAY_OF_MONTH, daysInterval - 1);
|
Date currentEnd = calendar.getTime();
|
||||||
calendar.set(Calendar.HOUR_OF_DAY, 23);
|
// 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd
|
||||||
calendar.set(Calendar.MINUTE, 59);
|
if (currentEnd.after(finalEnd)) {
|
||||||
calendar.set(Calendar.SECOND, 59);
|
currentEnd = finalEnd;
|
||||||
calendar.set(Calendar.MILLISECOND, 999);
|
|
||||||
|
|
||||||
Date rangeEnd = calendar.getTime();
|
|
||||||
|
|
||||||
// 如果区间结束时间超过最终结束时间,使用最终结束时间
|
|
||||||
if (rangeEnd.after(adjustedEndDate)) {
|
|
||||||
rangeEnd = adjustedEndDate;
|
|
||||||
}
|
}
|
||||||
|
// 添加当前区间 [currentStart, currentEnd]
|
||||||
ranges.add(new Date[]{rangeStart, rangeEnd});
|
ranges.add(new Date[]{currentStart, currentEnd});
|
||||||
|
// 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分
|
||||||
// 准备下一个区间的开始时间:当前区间结束时间的下一天00:00:00
|
if (currentEnd.equals(finalEnd)) {
|
||||||
calendar.add(Calendar.MILLISECOND, 1); // 加1毫秒到下一天
|
|
||||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
||||||
calendar.set(Calendar.MINUTE, 0);
|
|
||||||
calendar.set(Calendar.SECOND, 0);
|
|
||||||
calendar.set(Calendar.MILLISECOND, 0);
|
|
||||||
|
|
||||||
// 如果已经达到或超过结束时间,则退出循环
|
|
||||||
if (calendar.getTime().after(adjustedEndDate)) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// 准备下一个区间的开始时间:当前结束时间(满足“连续”要求)
|
||||||
|
currentStart = currentEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ranges;
|
return ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具方法:将 Calendar 的时间部分强制设置为当天 00:00:00(截断时分秒毫秒)
|
||||||
|
* @param calendar 待处理的 Calendar 实例(非 null)
|
||||||
|
*/
|
||||||
|
private static void setTimeToStartOfDay(Calendar calendar) {
|
||||||
|
if (calendar == null) {
|
||||||
|
throw new IllegalArgumentException("Calendar 实例不可为 null");
|
||||||
|
}
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 0); // 24小时制,0 表示凌晨 0 点
|
||||||
|
calendar.set(Calendar.MINUTE, 0); // 分钟设为 0
|
||||||
|
calendar.set(Calendar.SECOND, 0); // 秒设为 0
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为 0
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字段映射转换
|
* 字段映射转换
|
||||||
* @param source 源数据记录
|
* @param source 源数据记录
|
||||||
|
|||||||
@ -233,6 +233,7 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService {
|
|||||||
boolean hasMore;
|
boolean hasMore;
|
||||||
RDSAPI rdsapi = null;
|
RDSAPI rdsapi = null;
|
||||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
try {
|
try {
|
||||||
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
||||||
DBUtils.SUPPLY supply = rdsapi.getSupply();
|
DBUtils.SUPPLY supply = rdsapi.getSupply();
|
||||||
@ -260,8 +261,8 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService {
|
|||||||
|
|
||||||
for (int i = 0; i < timeRanges.size(); i++) {
|
for (int i = 0; i < timeRanges.size(); i++) {
|
||||||
Date[] range = timeRanges.get(i);
|
Date[] range = timeRanges.get(i);
|
||||||
String startDate = simpleDateFormat.format(range[0]);
|
String startDate = simpleDateFormat2.format(range[0]);
|
||||||
String endDate = simpleDateFormat.format(range[1]);
|
String endDate = simpleDateFormat2.format(range[1]);
|
||||||
|
|
||||||
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
||||||
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
||||||
@ -374,8 +375,11 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService {
|
|||||||
// 如果时间字段存在,添加时间范围条件
|
// 如果时间字段存在,添加时间范围条件
|
||||||
if (timeField != null && !timeField.isEmpty()) {
|
if (timeField != null && !timeField.isEmpty()) {
|
||||||
conditionBuilder.append(" AND ")
|
conditionBuilder.append(" AND ")
|
||||||
.append(timeField)
|
.append(timeField).append(" >= ?")
|
||||||
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
.append(" AND ")
|
||||||
|
.append(timeField).append(" < ?")
|
||||||
|
.append(" ORDER BY ").append(timeField);
|
||||||
|
//.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
||||||
if (jezd != null && !jezd.isEmpty()) {
|
if (jezd != null && !jezd.isEmpty()) {
|
||||||
conditionBuilder.append(", " + jezd + " ");
|
conditionBuilder.append(", " + jezd + " ");
|
||||||
}
|
}
|
||||||
@ -383,8 +387,12 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService {
|
|||||||
}
|
}
|
||||||
} else if (timeField != null && !timeField.isEmpty()) {
|
} else if (timeField != null && !timeField.isEmpty()) {
|
||||||
// 没有分区字段,但时间字段存在,使用时间范围条件
|
// 没有分区字段,但时间字段存在,使用时间范围条件
|
||||||
conditionBuilder.append(timeField)
|
/*conditionBuilder.append(timeField)
|
||||||
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");
|
.append(" BETWEEN ? AND ? ORDER BY " + timeField + "");*/
|
||||||
|
conditionBuilder.append(timeField).append(" >= ?")
|
||||||
|
.append(" AND ")
|
||||||
|
.append(timeField).append(" < ?")
|
||||||
|
.append(" ORDER BY ").append(timeField);
|
||||||
if (jezd != null && !jezd.isEmpty()) {
|
if (jezd != null && !jezd.isEmpty()) {
|
||||||
conditionBuilder.append(", " + jezd + " ");
|
conditionBuilder.append(", " + jezd + " ");
|
||||||
}
|
}
|
||||||
@ -437,61 +445,73 @@ public class PurchaseDataSyncServiceImpl implements DataSyncService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将时间范围拆分为多个区间,确保区间连续且不重叠
|
* 将时间范围拆分为多个区间,确保区间连续(下一个区间的开始时间 = 上一个区间的结束时间)且无重叠
|
||||||
* @param startDate 开始时间(yyyy-MM-dd格式,时间部分为00:00:00)
|
* 所有日期均强制转换为 yyyy-MM-dd 格式(时间部分固定为 00:00:00)
|
||||||
* @param endDate 结束时间(yyyy-MM-dd格式,时间部分为00:00:00)
|
* @param startDate 开始时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00)
|
||||||
* @param daysInterval 间隔天数
|
* @param endDate 结束时间(建议传入 yyyy-MM-dd 格式,若含时间部分会自动截断为 00:00:00)
|
||||||
* @return 时间区间列表,每个区间的结束时间调整为23:59:59以确保覆盖完整日期
|
* @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08)
|
||||||
|
* @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式
|
||||||
*/
|
*/
|
||||||
private static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
public static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
||||||
List<Date[]> ranges = new ArrayList<>();
|
// 1. 入参合法性校验:避免无效区间或负间隔
|
||||||
|
if (startDate == null || endDate == null) {
|
||||||
|
throw new IllegalArgumentException("开始时间和结束时间不可为 null");
|
||||||
|
}
|
||||||
|
if (daysInterval < 1) {
|
||||||
|
throw new IllegalArgumentException("间隔天数必须大于等于 1");
|
||||||
|
}
|
||||||
|
// 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00)
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响)
|
||||||
calendar.setTime(startDate);
|
calendar.setTime(startDate);
|
||||||
|
Date currentStart = calendar.getTime();
|
||||||
|
|
||||||
// 调整结束时间以包含完整日期
|
|
||||||
Calendar endCal = Calendar.getInstance();
|
Calendar endCal = Calendar.getInstance();
|
||||||
|
setTimeToStartOfDay(endCal);
|
||||||
endCal.setTime(endDate);
|
endCal.setTime(endDate);
|
||||||
endCal.set(Calendar.HOUR_OF_DAY, 23);
|
Date finalEnd = endCal.getTime();
|
||||||
endCal.set(Calendar.MINUTE, 59);
|
// 额外校验:开始时间不能晚于结束时间
|
||||||
endCal.set(Calendar.SECOND, 59);
|
if (currentStart.after(finalEnd)) {
|
||||||
endCal.set(Calendar.MILLISECOND, 999);
|
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
||||||
Date adjustedEndDate = endCal.getTime();
|
}
|
||||||
|
List<Date[]> ranges = new ArrayList<>();
|
||||||
while (calendar.getTime().before(adjustedEndDate)) {
|
// 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束”
|
||||||
// 区间开始时间(当前日期的00:00:00)
|
while (true) {
|
||||||
Date rangeStart = calendar.getTime();
|
// 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08)
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, daysInterval);
|
||||||
// 增加间隔天数-1天,然后设置为23:59:59作为区间结束时间
|
setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00
|
||||||
calendar.add(Calendar.DAY_OF_MONTH, daysInterval - 1);
|
Date currentEnd = calendar.getTime();
|
||||||
calendar.set(Calendar.HOUR_OF_DAY, 23);
|
// 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd
|
||||||
calendar.set(Calendar.MINUTE, 59);
|
if (currentEnd.after(finalEnd)) {
|
||||||
calendar.set(Calendar.SECOND, 59);
|
currentEnd = finalEnd;
|
||||||
calendar.set(Calendar.MILLISECOND, 999);
|
|
||||||
|
|
||||||
Date rangeEnd = calendar.getTime();
|
|
||||||
|
|
||||||
// 如果区间结束时间超过最终结束时间,使用最终结束时间
|
|
||||||
if (rangeEnd.after(adjustedEndDate)) {
|
|
||||||
rangeEnd = adjustedEndDate;
|
|
||||||
}
|
}
|
||||||
|
// 添加当前区间 [currentStart, currentEnd]
|
||||||
ranges.add(new Date[]{rangeStart, rangeEnd});
|
ranges.add(new Date[]{currentStart, currentEnd});
|
||||||
|
// 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分
|
||||||
// 准备下一个区间的开始时间:当前区间结束时间的下一天00:00:00
|
if (currentEnd.equals(finalEnd)) {
|
||||||
calendar.add(Calendar.MILLISECOND, 1); // 加1毫秒到下一天
|
|
||||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
||||||
calendar.set(Calendar.MINUTE, 0);
|
|
||||||
calendar.set(Calendar.SECOND, 0);
|
|
||||||
calendar.set(Calendar.MILLISECOND, 0);
|
|
||||||
|
|
||||||
// 如果已经达到或超过结束时间,则退出循环
|
|
||||||
if (calendar.getTime().after(adjustedEndDate)) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// 准备下一个区间的开始时间:当前结束时间(满足“连续”要求)
|
||||||
|
currentStart = currentEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ranges;
|
return ranges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具方法:将 Calendar 的时间部分强制设置为当天 00:00:00(截断时分秒毫秒)
|
||||||
|
* @param calendar 待处理的 Calendar 实例(非 null)
|
||||||
|
*/
|
||||||
|
private static void setTimeToStartOfDay(Calendar calendar) {
|
||||||
|
if (calendar == null) {
|
||||||
|
throw new IllegalArgumentException("Calendar 实例不可为 null");
|
||||||
|
}
|
||||||
|
calendar.set(Calendar.HOUR_OF_DAY, 0); // 24小时制,0 表示凌晨 0 点
|
||||||
|
calendar.set(Calendar.MINUTE, 0); // 分钟设为 0
|
||||||
|
calendar.set(Calendar.SECOND, 0); // 秒设为 0
|
||||||
|
calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为 0
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理并插入数据到目标表
|
* 处理并插入数据到目标表
|
||||||
* @param sourceData 源数据列表
|
* @param sourceData 源数据列表
|
||||||
|
|||||||
@ -178,6 +178,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
|||||||
boolean hasMore;
|
boolean hasMore;
|
||||||
RDSAPI rdsapi = null;
|
RDSAPI rdsapi = null;
|
||||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
try {
|
try {
|
||||||
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
rdsapi = SDK.getCCAPI().getRDSAPI(ccId);
|
||||||
DBUtils.SUPPLY supply = rdsapi.getSupply();
|
DBUtils.SUPPLY supply = rdsapi.getSupply();
|
||||||
@ -204,8 +205,8 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
|||||||
|
|
||||||
for (int i = 0; i < timeRanges.size(); i++) {
|
for (int i = 0; i < timeRanges.size(); i++) {
|
||||||
Date[] range = timeRanges.get(i);
|
Date[] range = timeRanges.get(i);
|
||||||
String startDate = simpleDateFormat.format(range[0]);
|
String startDate = simpleDateFormat2.format(range[0]);
|
||||||
String endDate = simpleDateFormat.format(range[1]);
|
String endDate = simpleDateFormat2.format(range[1]);
|
||||||
|
|
||||||
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
LOGGER.info("正在处理第 {} 个时间区间: {} 至 {}", i + 1, startDate, endDate);
|
||||||
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
if ("ORACLE".equalsIgnoreCase(DBname)) {
|
||||||
@ -449,7 +450,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
|||||||
* @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08)
|
* @param daysInterval 每个区间的间隔天数(例如:传入 7 表示每个区间覆盖 7 天,如 2024-01-01~2024-01-08)
|
||||||
* @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式
|
* @return 时间区间列表,每个元素为 [开始时间, 结束时间],均为 yyyy-MM-dd 00:00:00 格式
|
||||||
*/
|
*/
|
||||||
private static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
public static List<Date[]> splitTimeRange(Date startDate, Date endDate, int daysInterval) {
|
||||||
// 1. 入参合法性校验:避免无效区间或负间隔
|
// 1. 入参合法性校验:避免无效区间或负间隔
|
||||||
if (startDate == null || endDate == null) {
|
if (startDate == null || endDate == null) {
|
||||||
throw new IllegalArgumentException("开始时间和结束时间不可为 null");
|
throw new IllegalArgumentException("开始时间和结束时间不可为 null");
|
||||||
@ -457,7 +458,6 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
|||||||
if (daysInterval < 1) {
|
if (daysInterval < 1) {
|
||||||
throw new IllegalArgumentException("间隔天数必须大于等于 1");
|
throw new IllegalArgumentException("间隔天数必须大于等于 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00)
|
// 2. 初始化日历并强制截断时间部分(确保所有日期都是 yyyy-MM-dd 00:00:00)
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响)
|
setTimeToStartOfDay(calendar); // 先重置时间,再设日期(避免原日期含时间的影响)
|
||||||
@ -468,34 +468,27 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
|
|||||||
setTimeToStartOfDay(endCal);
|
setTimeToStartOfDay(endCal);
|
||||||
endCal.setTime(endDate);
|
endCal.setTime(endDate);
|
||||||
Date finalEnd = endCal.getTime();
|
Date finalEnd = endCal.getTime();
|
||||||
|
|
||||||
// 额外校验:开始时间不能晚于结束时间
|
// 额外校验:开始时间不能晚于结束时间
|
||||||
if (currentStart.after(finalEnd)) {
|
if (currentStart.after(finalEnd)) {
|
||||||
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Date[]> ranges = new ArrayList<>();
|
List<Date[]> ranges = new ArrayList<>();
|
||||||
|
|
||||||
// 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束”
|
// 3. 循环拆分区间:核心逻辑确保“下一个开始 = 上一个结束”
|
||||||
while (true) {
|
while (true) {
|
||||||
// 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08)
|
// 计算当前区间的结束时间:开始时间 + 间隔天数(如 2024-01-01 + 7天 = 2024-01-08)
|
||||||
calendar.add(Calendar.DAY_OF_MONTH, daysInterval);
|
calendar.add(Calendar.DAY_OF_MONTH, daysInterval);
|
||||||
setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00
|
setTimeToStartOfDay(calendar); // 再次确保时间部分为 00:00:00
|
||||||
Date currentEnd = calendar.getTime();
|
Date currentEnd = calendar.getTime();
|
||||||
|
|
||||||
// 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd
|
// 处理最后一个区间:若计算的结束时间超过最终结束时间,强制对齐到 finalEnd
|
||||||
if (currentEnd.after(finalEnd)) {
|
if (currentEnd.after(finalEnd)) {
|
||||||
currentEnd = finalEnd;
|
currentEnd = finalEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加当前区间 [currentStart, currentEnd]
|
// 添加当前区间 [currentStart, currentEnd]
|
||||||
ranges.add(new Date[]{currentStart, currentEnd});
|
ranges.add(new Date[]{currentStart, currentEnd});
|
||||||
|
|
||||||
// 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分
|
// 终止条件:当前区间的结束时间已等于最终结束时间,无需继续拆分
|
||||||
if (currentEnd.equals(finalEnd)) {
|
if (currentEnd.equals(finalEnd)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 准备下一个区间的开始时间:当前结束时间(满足“连续”要求)
|
// 准备下一个区间的开始时间:当前结束时间(满足“连续”要求)
|
||||||
currentStart = currentEnd;
|
currentStart = currentEnd;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user