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

news2024/9/22 4:02:35

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

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

<select id="chart" resultType="com.xxxx.TaxiOrderChartVO"
          parameterType="com.xxxx.TaxiOrderChartQuery">
	select
    count(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代码

@Override
    public R chart(TaxiOrderChartQuery query) throws ParseException {
        List<TaxiOrderChartVO> list = taxiOrderMapper.chart(query);
        //年 yyyy
        List<TaxiOrderChartVO> list1 = new ArrayList<>();
        //月 yyyy-MM
        List<TaxiOrderChartVO> list2 = new ArrayList<>();
        //日 yyyy-MM-dd
        List<TaxiOrderChartVO> list3 = new ArrayList<>();
        //按年统计,没有的年份补充0
        if (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,没有的部分补充0
        if (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,没有的部分补充0
        if (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);
                //把月数增加 1
                calendar.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);
                //把天数增加 1
                calendar.add(Calendar.DATE, 1);
                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
    
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-CodeMirror 使用

vue2 安装 npm install vue-codemirror -S # or yarn add vue-codemirror -S 全局配置&#xff0c;main.js文件引入 import VueCodemirror from vue-codemirror // import base style import codemirror/lib/codemirror.css Vue.use(VueCodemirror)Vue 文件内使用 <templ…

QDialog的相关API函数

目录 常用的一些 API 函数: QDialog 的子类 QMessageBox&#xff1a; QFileDialog QFont 字体类 QColorDialog QInputDialog QProgressDialog 总结 QDialog是Qt框架中的一个控件类&#xff0c;用于实现对话框的界面。对话框通常用于显示一个独立的窗口&#xff0c;该窗口会显…

手撕spring05(xml解析bean)

概述 通过加载配置文件的信息&#xff0c;注册xml的bean配置 整体设计 知识点补充 返回指定资源的输入流 // 相对路径获取流 java.lang.ClassLoader#getResourceAsStream // 绝对路径获取流 java.io.FileInputStream#FileInputStream(java.io.File) // URL获取流 java.net…

尚医通02:医院API的CRUD+环境搭建

目录 今日必会 项目环境搭建 医院设置模块搭建 配置使用Swagger2 统一返回结果 实现带条件带分页查询接口 新增、修改接口开发 批量删除、锁定医院设置 统一异常处理 今日必会 1.简单的搭建环境。要明白什么时候是pom/war/jar yygh_parent <pom> commo…

开发第一个基于PyQt5的桌面应用

必须使用两个类&#xff1a;QApplication和QWidget。都在PyQt5.QtWidgets。 创建设计了一个小窗口 Qt-Designer的介绍 布局——垂直布局、水平布局、栅格布局、表张布局 空间 垂直、水平空间 按钮相关的控件 普通按钮、工具条按钮、单选按钮、多选按钮、连接命令按钮 列表控…

GD32F4_USB无法识别

Q&#xff1a;GD32F4做USB通讯&#xff0c;在120M\160M时钟主频下能被识别并通讯&#xff0c;在设置主频为200M时无法被识别或通讯异常。 A&#xff1a;注意USB时钟来源&#xff0c;USB工作时钟频率为48M

ETHERNET/IP转PROFIBUS-DP网关Profibus DP转EtherNet/IP协议转换网关

大家好&#xff0c;今天要给大家介绍一款非常神奇的通讯网关捷米特JM-DPM-EIP&#xff01;这款产品可以将各种PROFIBUS-DP从站接入到ETHERNET/IP网络中&#xff0c;真是一款神奇的产品啊&#xff01;你是否想过&#xff0c;如果没有这款产品&#xff0c;PROFIBUS-DP从站和ETHER…

ChatGPT上线GPT-4以来最强应用代码解释器(CodeInterpreter),5分钟教会你熟练使用比肩博士

7月9日消息&#xff0c;OpenAI的语言模型ChatGPT推出了新功能&#xff1a;代码解释器&#xff08;CodeInterpreter&#xff09;。这个新功能已经对所有Plus订阅用户开放&#xff0c;代码解释器扩展了ChatGPT的功能&#xff0c;为用户带来了更好的交互式编程体验和强大的数据可视…

mac批量在文件名前面加相同文字?

mac批量在文件名前面加相同文字&#xff1f;你平时在使用电脑进行工作或者学习的时候&#xff0c;是不是需要做一些关于文件整理和保存的操作呢&#xff0c;并且还需要对一大堆的文件进行重名呢&#xff1f;相信很大多数小伙伴都要面对这些&#xff0c;经常需要将大量文件的名称…

学习分布式锁原理的一些个人思考

首先分布式锁和我们平常讲到的锁原理基本一样&#xff0c;目的就是确保&#xff0c;在多个线程并发时&#xff0c;只有一个线程在同一刻操作这个业务或者说方法、变量。 在一个进程中&#xff0c;也就是一个jvm 或者说应用中&#xff0c;我们很容易去处理控制&#xff0c;在jd…

微软MFC技术中的消息队列及消息处理(上)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊微软MFC技术中的消息队列及消息处理。 MFC应用程序中由Windows 系统以消息的形式发送给应用程序的窗口。窗口接收和处理消息之后&#xff0c;把控制返回给Windows。Windows系统在同一时间可显示多…

Scratch 随机平台发球

Scratch 随机平台发球 本程序整合了之前发布的“随机平台跳跃”和“棒球发球与反弹”程序的功能。球被设为跟随角色以确保发球位置正常&#xff0c;增加的功能主要是球在碰到平台时可以结合上一个坐标判断接触到平台上方还是下方并向相应方向旋转90度以更好地模拟反弹效果&…

多元时间序列 | Matlab基于高斯过程回归GPR多维时间序列预测,GPR多变量时间序列预测(Matlab完整程序)

目录 多元时间序列 | RBF径向基神经网络多变量时间序列预测(Matlab完整程序)预测结果基本介绍程序设计参考资料多元时间序列 | RBF径向基神经网络多变量时间序列预测(Matlab完整程序) 预测结果 基本介绍 多元时间序列 | Matlab基于高斯过程回归GPR多维时间序列预测,

大量的闲置校园网/校园WiFi服务器

开学的时候服务器不够用&#xff0c;放假的时候服务器闲置下来&#xff0c;是不是还是得发展免流&#xff0c;只有免流才不分白天黑夜上学下学或者放假开学&#xff0c; 目前免流也就只能玩玩停机卡免流&#xff0c;定向流量转通用流量&#xff0c;除了停机卡比较稳定&#xf…

【CANoe+vTESTstudio】

vTESTstudio(TSO)是测试实施的专用工具。它是一种将传统的Test Automation Editor&#xff08;TAE&#xff09;那样的将用户界面、CAPL和C#等程序语言的实施环境集成在一起的工具。 vTESTstudio画面 vTESTstudio和CANoe 可以使用与CANoe通用的数据库&#xff0c;各文件类也可…

什么是分布式?——分布式的基本概念

目录 1、微服务 2、集群&分布式&节点 3、远程调用 4、负载均衡 5、服务注册/发现&注册中心 6、配置中心 7、服务熔断&服务降级 8、API 网关 1、微服务 微服务架构风格&#xff0c;就像是把一个 单独的应用程序 开发为 一套小服务 &#xff0c;每个 小…

基于springboot+Redis的前后端分离项目(七)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 发布笔记&#xff0c;点赞&#xff0c;点赞排行 达人探店1、达人探店-发布探店笔记2、 达人探店-查看探店笔记3、 达人探店-点赞功…

dvwa靶场通关(八)

第八关&#xff1a;SQL Injection (Blind) low 这一关是盲注&#xff0c; 所以不能用联合查询了&#xff0c;只能靠一点一点手动盲猜了 这里用到length和substr函数 先猜数据库名长度 1 and length(database())1# 用bp抓包&#xff0c;发送到爆破 选择攻击位置 库名长度应该…

ModaHub魔搭社区:向量数据库Zilliz Cloud向量搜索和查询教程(二)

目录 批量搜索 基于条件搜索 查询 批量搜索 Zilliz Cloud 支持在单个请求中同时指定多个查询向量来进行批量搜索。大多数情况下,批量搜索比单向量搜索效率更高,因为批量搜索的总延时会比逐一执行单向量搜索的累计延时要低。 您可以迭代数据集中的行,并以行为单位发送…

【UGUI学习笔记】Canvas

文章目录 组件介绍CanvasRender ModeOverlayCameraWorld Space Canvas ScalerReference Pixels Per UnitUI Scale ModeGraphic RaycasterBlocking Object Canvas Grope UGUI2.0官方文档 一些基础对应控件的Attribute的含义&#xff1a; Canvas相当于Android的Panel&#xff0c;…