统计年,月,日,java补充无的数据

需求:营收趋势图。需要按年,按月,按日。按年,后方选择日历 起始年-结束年。例如start2013 end 2023
按月,后方选择月份 起始月-结束月。例如start 2022-10 end 2023-07。
按日,后方选择日 起始日-结束日。例如 start 2023-06-15 end 2023-07-11。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先来用sql统计。sql分组统计出有的年月日。没有的数据用java补充即可。
在这里插入图片描述
展示对象
在这里插入图片描述
查询对象
在这里插入图片描述
改造成动态sql。根据type。分组不一样。

<select id="chart" resultType="com.xxxx.TaxiOrderChartVO"parameterType="com.xxxx.TaxiOrderChartQuery">selectcount(distinct user_id) as useNum,count(id) as orderNum,<if test="type=='YEAR'">YEAR(create_time) as type</if><if test="type=='MONTH'">DATE_FORMAT(create_time,'%Y-%m') as type</if><if test="type=='DAY'">DATE_FORMAT(create_time,'%Y-%m-%d') as type</if>from cz_taxi_orders<where><if test="type=='YEAR'"><if test="start != null and start != '' &amp;&amp; end != null and end != ''">YEAR(create_time) BETWEEN #{start} and #{end}</if></if><if test="type=='MONTH'"><if test="start != null and start != '' &amp;&amp; end != null and end != ''">DATE_FORMAT(create_time,'%Y-%m') BETWEEN #{start} and #{end}</if></if><if test="type=='DAY'"><if test="start != null and start != '' &amp;&amp; end != null and end != ''">DATE_FORMAT(create_time,'%Y-%m-%d') BETWEEN #{start} and #{end}</if></if></where>group by type</select>

Java代码

@Overridepublic R chart(TaxiOrderChartQuery query) throws ParseException {List<TaxiOrderChartVO> list = taxiOrderMapper.chart(query);//年 yyyyList<TaxiOrderChartVO> list1 = new ArrayList<>();//月 yyyy-MMList<TaxiOrderChartVO> list2 = new ArrayList<>();//日 yyyy-MM-ddList<TaxiOrderChartVO> list3 = new ArrayList<>();//按年统计,没有的年份补充0if (query.getType().equals("YEAR")){Integer end = Integer.valueOf(query.getEnd());Integer start = Integer.valueOf(query.getStart());for (int i = start; i <= end; i++) {TaxiOrderChartVO vo = new TaxiOrderChartVO();boolean flag = false;for (TaxiOrderChartVO chartVO : list) {if (chartVO.getType().equals(String.valueOf(i))){flag = true;vo.setOrderNum(chartVO.getOrderNum());vo.setUseNum(chartVO.getUseNum());vo.setType(chartVO.getType());}}if (!flag){vo.setUseNum(0);vo.setType(String.valueOf(i));vo.setOrderNum(0);}list1.add(vo);}return R.ok(list1);}//按月统计,2023-01至2023-12,没有的部分补充0if (query.getType().equals("MONTH")){List<String> monthBetweenDate = DateUtils.getMonthBetweenDate(query.getStart(), query.getEnd());for (String month : monthBetweenDate) {TaxiOrderChartVO vo  = new TaxiOrderChartVO();boolean flag = false;for (TaxiOrderChartVO chartVO : list) {if (chartVO.getType().equals(month)){flag = true;vo.setOrderNum(chartVO.getOrderNum());vo.setUseNum(chartVO.getUseNum());vo.setType(chartVO.getType());}}if (!flag){vo.setUseNum(0);vo.setType(month);vo.setOrderNum(0);}list2.add(vo);}return R.ok(list2);}//按日统计,2023-01-12至2023-02-10,没有的部分补充0if (query.getType().equals("DAY")){List<String> dayBetweenDate = DateUtils.getDayBetweenDate(query.getStart(), query.getEnd());for (String day : dayBetweenDate) {TaxiOrderChartVO vo  = new TaxiOrderChartVO();boolean flag = false;for (TaxiOrderChartVO chartVO : list) {if (chartVO.getType().equals(day)){flag = true;vo.setOrderNum(chartVO.getOrderNum());vo.setUseNum(chartVO.getUseNum());vo.setType(chartVO.getType());}}if (!flag){vo.setUseNum(0);vo.setType(day);vo.setOrderNum(0);}list3.add(vo);}return R.ok(list3);}return R.ok(list);}

月,日工具类

package com.zyx.common.utils;import java.text.SimpleDateFormat;
import java.util.*;/*** @author zyx* @date 2023/4/13 15:20*/public class DateUtils {/*** 获取两个日期之间的所有月份 (年月)* @param startTime* @param endTime* @return:list*/public static List<String> getMonthBetweenDate(String startTime, String endTime) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");// 声明保存日期集合List<String> list = new ArrayList<>();try {// 转化成日期类型Date startDate = sdf.parse(startTime);Date endDate = sdf.parse(endTime);//用Calendar 进行日期比较判断Calendar calendar = Calendar.getInstance();while (startDate.getTime() <= endDate.getTime()) {// 把日期添加到集合list.add(sdf.format(startDate));// 设置日期calendar.setTime(startDate);//把月数增加 1calendar.add(Calendar.MONTH, 1);// 获取增加后的日期startDate = calendar.getTime();}} catch (Exception e) {e.printStackTrace();}return list;}/*** 获取两个日期之间的所有天数 (年月日)* @param startTime* @param endTime* @return:list*/public static List<String> getDayBetweenDate(String startTime, String endTime) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 声明保存日期集合List<String> list = new ArrayList<>();try {// 转化成日期类型Date startDate = sdf.parse(startTime);Date endDate = sdf.parse(endTime);//用Calendar 进行日期比较判断Calendar calendar = Calendar.getInstance();while (startDate.getTime() <= endDate.getTime()) {// 把日期添加到集合list.add(sdf.format(startDate));// 设置日期calendar.setTime(startDate);//把天数增加 1calendar.add(Calendar.DATE, 1);// 获取增加后的日期startDate = calendar.getTime();}} catch (Exception e) {e.printStackTrace();}return list;}}

访问接口文档。测试效果。可以实现,接下来就是和前端沟通按年传YEAR,按月传MONTH,按日传DAY即可。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学术英语UNIT1~UNIT4知识点总结

目录 UNIT 1 1.Deciding on topic --AMI 2.Writing a working title 3.Literacy Skills--Avoiding plagiarism 4.Literacy Skills--citation and referring skills 5.Literacy Skills--quoting 6.Literacy Skills--summarizing UNIT2 1.Academic Writing -searching…

Linux - CentOS 二进制安装 MySQL 8.0.31(非常实用)

一、下载 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 具体如下图所示&#xff1a; 二、将 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 放入到服务器的 /usr/local &#xff08;路径可…

C# PaddleInference OCR 验证码识别

说明 C# PaddleInference OCR 验证码识别 自己训练的模型&#xff0c;只针对测试图片类型&#xff0c;准确率99% 效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInference 测试图片 代码 using OpenCvSharp; using Sdcb.PaddleInference.Native; using Sdcb.PaddleInfer…

设计模式——中介者模式

中介者模式&#xff08;非中介者场景&#xff09; 即没有统一的管理者&#xff0c;需要与其他类交流时就new一个 场景 三个类&#xff1a;采购、销售、库存采购商品时&#xff0c;联系销售看看的销售情况好不好&#xff0c;再决定采购的数量销售负责反馈销售情况&#xff0c…

C++教程——const修饰指针、结构体、文件操作

const修饰指针 常量指针 指针常量 const既修饰指针&#xff0c;又修饰常量 指针与数组 结构体 通过指针访问结构体变量中的数据 结构体中const使用场景 文件操作 写文件 读文件 读取数据的方式 二进制读写文件 写文件 读文件

猿人学第二届第一题找修改位置(非答题)

第二届第一题 AES(魔改) Base64(魔改) MD5 第一题不难&#xff0c;想要得到结果直接扣代码就行&#xff0c;但是我想找找到底修改了哪个位置。 MD5( AES (now page) ) AES加密ECB-pksc7 的 key 标准是128位即 16*8(bit) &#xff0c;这里666yuanrenxue66 是15位不是标准k…

ARG DEBIAN_FRONTEND=noninteractive作用说明

使用 在Dockerfile中使用ARG指令定义变量并为其指定一个默认值。ARG指令用于在构建过程中传递变量的值。 对于DEBIAN_FRONTENDnoninteractive&#xff0c;它定义了一个名为DEBIAN_FRONTEND的变量&#xff0c;并将其默认值设置为noninteractive。在这个上下文中&#xff0c;no…

「深度学习之优化算法」(十一)鲸鱼算法

1. 鲸鱼算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   鲸鱼算法(Whale Optimization Algorithm)是根据鲸鱼围捕猎物的行为而提出的算法。鲸鱼是一种群居的哺乳动物,在捕猎时它们也会相互合作对猎物进行驱赶和围捕。鲸鱼算法提出时间并不长,也是一个新兴…

TencentOS3.1安装PHP+Nginx+redis测试系统

PHP和Nginx应用统一安装在/application下。 Nginx选用了较新的版本1.25.0 官网下载安装包&#xff0c;解包。执行如下命令编译&#xff1a; ./configure --prefix/application/nginx-1.25.0 --usernginx --groupnginx --with-http_ssl_module --with-http_stub_status_modu…

Jenkins 创建一个 job , 用于单独执行脚本

目录 1.首先,在Jenkins中创建一个新的job 2.之后&#xff0c;会进入配置页面&#xff0c;在配置页面进行配置。 2.1.找到【Build Steps】在下&#xff0c;拉菜单中选择「シェルの実行」 &#xff08;Shell的运行&#xff09; 2.2.之后&#xff0c;会出现シェルスクリプト …

【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析

在进行性能测试时&#xff0c;我们需要对测试结果进行监控和分析&#xff0c;以便于及时发现问题并进行优化。 Locust在内存中维护了一个时间序列数据结构&#xff0c;用于存储每个事件的统计信息。 这个数据结构允许我们在Charts标签页中查看不同时间点的性能指标&#xff0c…

pytorch LBFGS

LBFGS pytorch的LBFGS也是一个优化器 但是与一般的优化器不同 平常我们的顺序是 losscriterion(predict, gt) optim.zero_grad() loss.backward() optim.step()而LBFGS是 def closure():optim.zero_grad()loss criterion(predict, gt)loss.backward()return lossoptim.step…