时间范围内按某个刻度取各个刻度间的数据
在实际开发中我们可能会遇到取时间范围内刻度下各个刻度的数据,首先,定义刻度类型
@Data
public class RainQueryParamVo implements Serializable{//分钟public static final String BUSI_TYPE_MINUTE = "MIN";//小时public static final String BUSI_TYPE_HOUR = "H";//天public static final String BUSI_TYPE_DAY = "D";//旬public static final String BUSI_TYPE_XUN = "X";//月public static final String BUSI_TYPE_MONTH = "M";//年public static final String BUSI_TYPE_YEAR = "Y";private Date start;private Date end;//查询类型private String busiType;//分钟值:5、10、20、30...等private Integer mtph;//小时值:1、3、6、12...等private Integer tph;
}
其次:处理时间工具类
private Map<String, Object> setQueryRainsRainParam(RainQueryParamVo paramVo, Map<String, Object> queryParam) {Calendar caS = Calendar.getInstance();Calendar caE = Calendar.getInstance();caS.setTime(paramVo.getStart());caE.setTime(paramVo.getEnd() == null ? paramVo.getStart() : paramVo.getEnd());List<Date> stmList = new ArrayList<>();List<Date> etmList = new ArrayList<>();String busiType = paramVo.getBusiType();switch (busiType.toUpperCase()) {//按分查询case RainQueryParamVo.BUSI_TYPE_MINUTE:int minute = paramVo.getMtph(), min = 0;while (true) {Date dNewStart = DateUtil.add(paramVo.getStart(), Calendar.MINUTE, min * minute);Date dNewEnd = DateUtil.add(paramVo.getStart(), Calendar.MINUTE, minute * (min + 1));min++;if (dNewEnd.getTime() > paramVo.getEnd().getTime()) {break;}stmList.add(dNewStart);etmList.add(dNewEnd);}break;//按小时查询case RainQueryParamVo.BUSI_TYPE_HOUR:int hourStep = paramVo.getTph(), h = 0;while (true) {Date dNewStart = DateUtil.add(paramVo.getStart(), Calendar.HOUR_OF_DAY, h * hourStep);Date dNewEnd = DateUtil.add(paramVo.getStart(), Calendar.HOUR_OF_DAY, hourStep * (h + 1));h++;if (dNewEnd.getTime() > paramVo.getEnd().getTime()) {break;}stmList.add(dNewStart);etmList.add(dNewEnd);}break;//按天查询case RainQueryParamVo.BUSI_TYPE_DAY:Double intevalDay = DateUtil.getDiffForDay(caS.getTime(), caE.getTime(), true) + 1;for (int i = 0; i < intevalDay; i++) {Date dNewStart = DateUtil.add(paramVo.getStart(), Calendar.DAY_OF_MONTH, i);Calendar calStart = Calendar.getInstance();calStart.setTime(dNewStart);calStart.set(Calendar.HOUR_OF_DAY, 8);Date dNewEnd = DateUtil.add(paramVo.getStart(), Calendar.DAY_OF_MONTH, i + 1);Calendar calEnd = Calendar.getInstance();calEnd.setTime(dNewEnd);calEnd.set(Calendar.HOUR_OF_DAY, 8);stmList.add(calStart.getTime());etmList.add(calEnd.getTime());}break;//按旬查询case RainQueryParamVo.BUSI_TYPE_XUN:Double xIntervalDay = DateUtil.getDiffForDay(paramVo.getStart(), paramVo.getEnd(), true) + 1;for (int i = 0; i < xIntervalDay; i++) {if (i == 0) {stmList.add(paramVo.getStart());if (xIntervalDay == 1) {etmList.add(DateUtil.add(paramVo.getStart(), Calendar.DAY_OF_MONTH, 1));}} else if (i == xIntervalDay.intValue() - 1) {etmList.add(paramVo.getEnd());} else {Calendar current = Calendar.getInstance();current.setTime(DateUtil.add(paramVo.getStart(), Calendar.DAY_OF_MONTH, i));int currentDate = current.get(Calendar.DAY_OF_MONTH);if (currentDate == 1) {etmList.add(current.getTime());stmList.add(current.getTime());} else if (currentDate == 10) {etmList.add(current.getTime());stmList.add(current.getTime());} else if (currentDate == 20) {etmList.add(current.getTime());stmList.add(current.getTime());}}}break;//按月查询case RainQueryParamVo.BUSI_TYPE_MONTH:int intervalMonths = DateUtil.getDiffForMonth(paramVo.getStart(), paramVo.getEnd()) + 1;for (int i = 0; i < intervalMonths; i++) {Date dNewStart = DateUtil.add(paramVo.getStart(), Calendar.MONTH, i);Date dNewEnd = DateUtil.add(paramVo.getStart(), Calendar.MONTH, i + 1);stmList.add(dNewStart);etmList.add(dNewEnd);}break;default:break;}queryParam.put("stmList", stmList);queryParam.put("etmList", etmList);queryParam.put("stm", paramVo.getStart());queryParam.put("etm", etmList.size() == 0 ? paramVo.getEnd() : etmList.get(etmList.size() - 1));return queryParam;}
最后在执行sql查询
<select id="query" resultType="com.alibaba.fastjson.JSONObject">select * from( select tabel.name, <foreach collection="params.stmList" item="item" index="index">(select sum(字段) from table t1 where t1.字段= tt.字段 and tm > #{item} and tm <![CDATA[ <= ]]>#{params.etmList[${index}]}) as new${index},</foreach>(select sum (字段) from table t1 pptn where t1.字段= tt.字段 and tm > #{params.start} and tm <![CDATA[ <= ]]>#{params.end}) as totalfrom table tt)t </select>
时间范围内按某个刻度取各个刻度间的数据相关推荐
- 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求
数值型坐标轴刻度计算算法 前言 算法描述 上代码 代码运行效果 ts版本(2021/3/10补充) 结语 前言 因实习的公司是做大数据的,而我的工作刚好又是需要绘制一些数据图表的.绘制图表有许多现成的 ...
- [046量化交易]python 抓取指定时间范围内的股票基础信息写入Mongodb
# -*- coding: utf-8 -*- from datetime import datetime, timedelta import tushare as ts from pymongo i ...
- 12.完善统计图形——调整刻度范围和刻度标签
文章目录 1.调整刻度范围和刻度标签--xlim()和xticks() 2.逆序设置坐标轴刻度标签 刻度范围是绘图区域中坐标轴的取值区间,包括x轴和y轴的取值区间.刻度范围是否合适直接决定绘图区域中图 ...
- python使用matplotlib可视化:设置坐标轴的范围、设置主次坐标轴刻度、坐标轴刻度显示样式、坐标轴刻度数颜色、小数点位数、坐标轴刻度网格线、线条类型、数据点形状标签、文本字体、颜色、大小等
python使用matplotlib可视化:设置坐标轴的范围.设置主次坐标轴刻度.坐标轴刻度显示样式.坐标轴刻度数颜色.小数点位数.坐标轴刻度网格线.线条类型.数据点形状标签.文本字体.颜色.大小等 ...
- pandas创建时间序列仿真数据并过滤(filter)时间数据:头尾数据、某年的数据、某年某月的数据、某年某月某日的数据、某个时间范围内的数据、truncate函数查看特定时间之前护着之后的数据
pandas创建时间序列仿真数据并过滤(filter)时间数据:头尾数据.某年的数据.某年某月的数据.某年某月某日的数据.某个时间范围内的数据.truncate函数查看特定时间之前护着之后的数据 目录
- R筛选dataframe时间范围内的数据
R筛选dataframe时间范围内的数据 目录 R筛选dataframe时间范围内的数据 两个日期之间的数据 某一日期之后的子集
- 网页视频15分钟自动暂停_在15分钟内学习网页爬取
网页视频15分钟自动暂停 什么是网页抓取? (What is Web Scraping?) Web scraping, also known as web data extraction, is th ...
- matplotlib入门基础(五)轴坐标范围 轴刻度比例 轴刻度
这篇文章同样以面向对象风格为主,介绍设置轴坐标范围.轴刻度比例.轴刻度(xtick,ytick)的方法. 这篇文章分以下部分来介绍: 1. 设置轴坐标范围 2. 设置轴刻度比例 3. 设置轴刻度 1. ...
- [MySQL] 统计图数据查询 (MySQL查询时间范围内所有日期)
1. 需求 任何管理系统都有统计图, 像这样的: 这里需要数据: 横坐标名 纵坐标数值 案例 需求: 需要统计近七天的注册用户数量 前端需要的数据格式: [{"日期":" ...
最新文章
- 【Ubuntu】ubuntu工具 记录shell终端的内容到文件中:script
- 利用SMS OSD实现win2008操作系统的部署
- correlation 蒙特卡洛_蒙特卡洛模拟法及其Matlab案例
- 在飞音G801上运行OpenWRT+Asterisk
- java 抽奖 高并发处理_如何设计高并发下的抽奖?
- 嵌入式系统中的几个关键基本概念!
- apache2.4 php5.5 配置,求助,apache2.4+php5.5,配置好不能运行,错误信息如下
- 转帖节选:卓有成效的管理者(彼得.德鲁克)
- 让你了解一下世界名人blog
- 猿创征文|深度学习基于ResNet18网络完成图像分类
- matlab中gui选择一个文件,matlabgui中定义函数
- 复化科特斯公式matlab_牛顿科特斯公式要点分析.ppt
- c# SharpPcap 截包,抓包 - 资料收集贴 --转
- FFmpeg 在 Python 中的安装使用方法详解
- MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组
- 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)
- 高通终端修改nv值后,不重启终端即生效
- app跳转到app store评分界面
- windows远程linux的工具
- Python 进阶 - 元组解包