1、字符串日期获取当前日期的星期一
//获取当前日期
LocalDate currentDate = LocalDate.parse(date);
//计算当前日期是星期几
DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
//判断星期几是否大于1(如果当前日期不是本周的第一天,需要计算第一天的偏移量)
int offset = DayOfWeek.MONDAY.getValue() - dayOfWeek.getValue();
//计算本周的第一天
LocalDate firstDayOfWeek = currentDate.plusDays(offset);
2、批量数据分批推送
// 创建一个包含30条数据的列表
List<String> dataList = new ArrayList<>();
for (int i = 1; i <= 30; i++) {
dataList.add("Data " + i);
}
// 每次推送的数据数量
int batchSize = 5;
// 计算需要推送的批次数量
int totalBatches = (int) Math.ceil((double) dataList.size() / batchSize);
// 循环推送每个批次的数据
for (int batch = 0; batch < totalBatches; batch++) {
int fromIndex = batch * batchSize;
int toIndex = Math.min(fromIndex + batchSize, dataList.size());
// 获取当前批次的数据
List<String> currentBatch = dataList.subList(fromIndex, toIndex);
// 推送当前批次的数据
pushData(currentBatch);
}
3、一张表多行根据条件合并成不同字段的一行
-- 表设计如下
CREATE TABLE "capability_manage"."ssa_result_station_base" (
"order_id" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,
"order_name" varchar(255) COLLATE "pg_catalog"."default",
"key_string" varchar(255) COLLATE "pg_catalog"."default",
"key_sheet" varchar(100) COLLATE "pg_catalog"."default",
"key_value" varchar(255) COLLATE "pg_catalog"."default",
"value_type" varchar(255) COLLATE "pg_catalog"."default",
"insert_time" timestamp(6)
)
--插入数据
INSERT INTO "capability_manage"."ssa_result_station_base" ("order_id", "order_name", "key_string", "key_sheet", "key_value", "value_type", "insert_time") VALUES ('xxxxxxx41', '测试工单1', '地市', NULL, '西安', 'string', NULL);
INSERT INTO "capability_manage"."ssa_result_station_base" ("order_id", "order_name", "key_string", "key_sheet", "key_value", "value_type", "insert_time") VALUES ('xxxxxxx41', '测试工单1', '站型', NULL, '室分', 'string', NULL);
-- 具体表数据如下图,我们能要根据key_string不同,分别拆成一行的多个不同列,sql如下
WITH aggregated_data AS (
SELECT
order_id,
jsonb_object_agg(key_string, key_value) AS key_values
FROM
ssa_result_station_base
GROUP BY
order_id
)
SELECT
order_id,
key_values->>'地市' AS regionName,
key_values->>'站型' AS siteType
FROM
aggregated_data;
-- 具体结果如下图
4、分批保存
如果批量保存的时候,一次太多,可以拆分后,保存
//每次批量的条数
int numberBatch = 300;
double number = checkList.size() * 1.0 / numberBatch;
// 向上取整
int n = ((Double)Math.ceil(number)).intValue();
for(int i = 0; i < n; i++){
int end = numberBatch * (i + 1);
// end不能超过最大索引值
if(end > checkList.size()){
end = checkList.size();
}
// 分批插入数据库
this.centralizedAnalysisOrderCheckDao.insertBatch(checkList.subList(numberBatch * i , end));
}