首页 > 编程语言 >java 实现查询近七天数据功能

java 实现查询近七天数据功能

时间:2023-01-30 19:33:35浏览次数:52  
标签:七天 task java value 查询 shape api const


java 实现查询近七天数据功能

接上一篇 如何使用echarts表图​​地址​​ 实现了页面的表图 那么如何对接数据 如何使用 耐心看完!!!

java 实现查询近七天数据功能_java

这次就以右下角这一个表图做示范

这个表图的下面是按时间排序的 并且是动态的 每次获取从今天到前六天的日期 共七天 上面的数据代表每一天的数据量是多少


在开写之前 先来看实现的思路

1.编写SQL 根据这七天的日期作为条件查询数据库
2.获取JAVA内每次从今天开始到前六天的日期数据
3.将查询出来数据做逻辑处理 之后返回json字符串
4.前端使用ajax对接接口 将获取的数据对接到echarts表图上面
!注意 如果你只是看如何获取近七天的数据只看 1 2 3即可

1.编写SQL 根据这七天的日期作为条件查询数据库

说了实现思路 那么现在看一眼我的表结构是什么样子的

java 实现查询近七天数据功能_数据可视化_02

这里看到一共是7条数据 一共是 3条26号 4条25号 1条23号的数据

那么我们查询出来 按每日查询 有数据的显示几条数量

上SQL

SELECT
COUNT( * ) AS 'count',
DATE_FORMAT( start_task_time, '%Y-%m-%d' ) AS date
FROM
task
WHERE
DATE_FORMAT( start_task_time, '%Y-%m-%d' ) IN ( '2020-10-27', '2020-10-26', '2020-10-25', '2020-10-24', '2020-10-23', '2020-10-22', '2020-10-21' )
GROUP BY
DATE_FORMAT( start_task_time, '%Y-%m-%d' )
ORDER BY
DATE_FORMAT( start_task_time, '%Y-%m-%d' ) DESC;

查询出来的效果图

java 实现查询近七天数据功能_html_03


那么现在先来讲解一下sql 我是数据库里面时间是带了时分秒 而查询的条件日期是不带时分秒的 这句话的意思是日期格式转换 转换成年月日 去掉时分秒

DATE_FORMAT( start_task_time, '%Y-%m-%d' )

中间的这个是要查询的字段

java 实现查询近七天数据功能_javascript_04


java 实现查询近七天数据功能_java_05

现在把SQL拆开来看 先看第一部分

sql的第一部分很好理解 第一个是查询出整表共有几条数据 ,第二个是查询出时间 AS的意思是字段取别名 。

现在查询出来的数据是 整表共8条数据 第一条的数据的时间是2020-10-25日

java 实现查询近七天数据功能_html_06

现在来看SQL的第二段

where DATE_FORMAT( start_task_time, ‘%Y-%m-%d’ ) 是要查询的条件我们根据日期条件进行查询 由于是一次查询七天的 所以需要使用 IN 一个字段多个条件。

后面的group by 分组 每一个日期条件查询出来的时间 进行分组 并显示共有几条 。

最后一个order by 排序

java 实现查询近七天数据功能_java_07

OK! 现在看完了sql 来看最后的查询结果 。现在发现如果哪一天有数据的话是可以查询出来并分组的,如何没有数据是查询不出来的 。但是我们查询出近七天的数据,如果没有值就补全为0。

java 实现查询近七天数据功能_java_08

2.获取JAVA内每次从今天开始到前六天的日期数据
补全剩下没有日期的数据,这里就需要我们JAVA逻辑来实现了。
首先刚刚的sql语句条件是自己写的 在java里面我们可不能手写要每次都动态的获取从今天开始到前六日的日期数据共七天。
那么上JAVA代码 获取近七天的日期

//获取近七天日期
public static List<String> getSevenDate() {
List<String> dateList = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < 7; i++) {
Date date = DateUtils.addDays(new Date(), -i);
String formatDate = sdf.format(date);
dateList.add(formatDate);
}
return dateList;
}

java 实现查询近七天数据功能_javascript_09


3.将查询出来数据做逻辑处理 之后返回json字符串

在java中获取到了最新的近七天的日期 现在将日期和sql结合 在项目中查询出数据来。

现在看接口,先看前两句,第一句是获取近七天数据,我把代码封装到工具类中了,直接调用的,第二句是将生成的日期作为参数,执行查询方法

java 实现查询近七天数据功能_后端_10


这里看Mapper foreach 当中collection 传的是map就写map 传list就写list 这里咱们查询方法 默认就写list就行,item是集合中每一个元素进行迭代时的别名, 传的参数名叫什么这个就叫什么就可以。 其他的默认不用管

java 实现查询近七天数据功能_java_11

<select id="sevenDaysCompleteTask" resultType="com.example.demo.bean.Task">
SELECT
COUNT(*) AS 'FinishTheTask',
DATE_FORMAT(start_task_time,'%Y-%m-%d') AS start_task_time
FROM
task
WHERE
is_delete='0'
and
DATE_FORMAT(start_task_time, '%Y-%m-%d') IN
<foreach collection="list" item="sevenDate" separator="," open="(" close=")">
#{sevenDate}
</foreach>
GROUP BY
DATE_FORMAT(start_task_time, '%Y-%m-%d')
ORDER BY
DATE_FORMAT(start_task_time, '%Y-%m-%d') DESC;
</select>

写完后我们测试一下看看查询出来的数据是什么样子

java 实现查询近七天数据功能_数据可视化_12


用postman测试了一下接口和在数据库查询返回的数据是一样的

java 实现查询近七天数据功能_html_13


java 实现查询近七天数据功能_数据可视化_14


那么现在用java将没有的日期和数量进行补全

在开始写之前说一下编写思路

现在知道生成的日期长度是7 而数据库查询出来的数据长度是不一定的 因为只有那个日期有数据的话才能查询出来, 实现思路是 创建一个空的arraylist集合来放我们的封装类,循环创建封装类要创建七个,之后循环拿生成的时间和数据库查询出的时间做比较,如果一致就将查询出来的数据添加进封装类中,如果不一致就设置为0,因为我们要有七天的数据,所以要有七条数据,每一条数据一个封装类,共七个,之后循环的将封装类添加进arraylist集合中。我不知道大家能不能看明白我所表达的意思 ,如果不明白也没关系,去看代码一句一句理解意思。

下面我上代码 我会一句一句解释意思
第三句创建一个arraylist对象 这个就是我们最后要返回的集合 这个不难理解
第四句 for循环 长度是我们生成日期数组长度 也就是七个
第五句 创建封装类 外圈循环七次 一共会创建七个封装类 一个封装类代表一条数据
第六句 创建boolean类型变量 ,用来判断生成的日期和查询出的日期是否一致,默认为false
第七句 创建小循环 目的是每次小循环都去循环查询出来的日期 一个一个的跟生成出的日期比较,如果一致就将查询出的数据添加进封装类中,并且设置boolean类型为true 不让进入设置0的判断,并结束此次小循环,开始第二次大循环。
第八句 将查询出的数据添加进封装类中
第九句 设置boolean类型为true
第十句 结束此次小循环 break
第十一句 每次大循环都要判断 是否进入了循环内部判断 如果进入就不设置0 如果没有进入就设置为0
第十二句 将每次的封装类添加到list集合中 并最后返回

java 实现查询近七天数据功能_java_15


java 实现查询近七天数据功能_html_16


上面图片有点误差 最后的list要放到外面

@ResponseBody
@RequestMapping("/sevenDaysCompleteTask")
public List<Task> sevenDaysCompleteTask(){
try {
//获取近七天日期
List<String> sevenDate = ConFig.getSevenDate();
//查询近七天完成任务数量方法
List<Task> tasks = healthCommissionService.sevenDaysCompleteTask(sevenDate);
//创建一个arraylist对象
List<Task> list=new ArrayList<>();
//外层七天循环 循环七次
for (int i=0;i<sevenDate.size();i++){
//创建封装类对象 循环七次 创建七个
Task task=new Task();
//将近七天日期添加进封装类中
task.setStart_task_time(sevenDate.get(i));
boolean bool=false;
//创建内循环 根据查询出已有的数量 循环次数
for (int m=0;m<tasks.size();m++){
if (sevenDate.get(i).equals(tasks.get(m).getStart_task_time())){
task.setFinishTheTask(tasks.get(m).getFinishTheTask());
bool=true;
break;
}
}
if (!bool) {
task.setFinishTheTask("0");
}
list.add(task);
}
return list;
}catch (Exception e) {
LOG.error("错误信息", e);
return null;
}
}

好了 java的逻辑已经完成了 最后看一下返回的数据

java 实现查询近七天数据功能_后端_17


java 实现查询近七天数据功能_数据可视化_18

现在成功的吧没有数据的日期也添加到集合并且返回了 4.前端使用ajax对接接口 将获取的数据对接到echarts表图上面

OK!! 最后一步 对接echarts图表

打开html 在图表的js里面先创建两个 数组 一个代表时间 一个代表数量 也就是图表当中的这两部分

java 实现查询近七天数据功能_html_19


java 实现查询近七天数据功能_javascript_20


使用ajax 对接接口 用each循环将返回的json数据添加进两个数组中

java 实现查询近七天数据功能_javascript_21


将数据添加进去后 把数组放入echarts图表中

![在这里插入图片描述](/i/ll/?i=20201027160203476.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjY0MzI5,size_16,color_FFFFFF,t_30#pic_center

java 实现查询近七天数据功能_数据可视化_22


这里就结束了 看成品效果

java 实现查询近七天数据功能_html_23

最后放js代码 比较长

<!--完成任务七天数量条形图js-->
<script>
//七天时间变量
var time1=[];
//近七天完成任务数量
var numberofelderly1=[];
$(function () {
$.ajax({
type:"post",
url:"sevenDaysCompleteTask",
async: false,
datatype: "json",
success:function (data){
$.each(data, function(i,item) {
time1.push(item.start_task_time);
numberofelderly1.push(item.finishTheTask);
})
var myChart = echarts.init(document.getElementById('main'));
const CubeLeft = echarts.graphic.extendShape({
shape: {
x: 20,
y: 10
},
buildPath: function(ctx, shape) {
const xAxisPoint = shape.xAxisPoint
const c0 = [shape.x, shape.y]
const c1 = [shape.x - 9, shape.y - 9]
const c2 = [xAxisPoint[0] - 9, xAxisPoint[1] - 9]
const c3 = [xAxisPoint[0], xAxisPoint[1]]
ctx.moveTo(c0[0], c0[1]).lineTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).closePath()
}
})
const CubeRight = echarts.graphic.extendShape({
shape: {
x: 10,
y: 10
},
buildPath: function(ctx, shape) {
const xAxisPoint = shape.xAxisPoint
const c1 = [shape.x, shape.y]
const c2 = [xAxisPoint[0], xAxisPoint[1]]
const c3 = [xAxisPoint[0] + 18, xAxisPoint[1] - 9]
const c4 = [shape.x + 18, shape.y - 9]
ctx.moveTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath()
}
})
const CubeTop = echarts.graphic.extendShape({
shape: {
x: 0,
y: 0
},
buildPath: function(ctx, shape) {
const c1 = [shape.x, shape.y]
const c2 = [shape.x + 18, shape.y - 9]
const c3 = [shape.x + 9, shape.y - 18]
const c4 = [shape.x - 9, shape.y - 9]
ctx.moveTo(c1[0], c1[1]).lineTo(c2[0], c2[1]).lineTo(c3[0], c3[1]).lineTo(c4[0], c4[1]).closePath()
}
})
echarts.graphic.registerShape('CubeLeft', CubeLeft)
echarts.graphic.registerShape('CubeRight', CubeRight)
echarts.graphic.registerShape('CubeTop', CubeTop)
const MAX = numberofelderly1
const VALUE = numberofelderly1
option = {
// backgroundColor: "#010d3a",
title: {
text: '',
top: 32,
left: 18,
textStyle: {
color: '#00F6FF',
fontSize: 24
}
},
/*调整表格大小*/
grid: {
left: 0,
right: 0,
bottom: '6%',
top: 90,
containLabel: true
},
xAxis: {
type: 'category',
data: time1,
axisLine: {
show: true,
lineStyle: {
color: 'white'
}
},
offset: 20,
axisTick: {
show: false,
length: 9,
alignWithLabel: true,
lineStyle: {
color: '#7DFFFD'
}
},
axisLabel: {
fontSize: 10
}
},
yAxis: {
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: 'white'
}
},
splitLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
fontSize: 15
},
boundaryGap: ['0', '20%']
},
series: [{
type: 'custom',
renderItem: function(params, api) {
const location = api.coord([api.value(0), api.value(1)])
return {
type: 'group',
children: [{
type: 'CubeLeft',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: 'rgba(7,29,97,.6)'
}
}, {
type: 'CubeRight',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: 'rgba(10,35,108,.7)'
}
}, {
type: 'CubeTop',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: 'rgba(11,42,106,.8)'
}
}]
}
},
data: MAX
}, {
type: 'custom',
renderItem: (params, api) => {
const location = api.coord([api.value(0), api.value(1)])
return {
type: 'group',
children: [{
type: 'CubeLeft',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#3B80E2'
},
{
offset: 1,
color: '#49BEE5'
}
])
}
}, {
type: 'CubeRight',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#3B80E2'
},
{
offset: 1,
color: '#49BEE5'
}
])
}
}, {
type: 'CubeTop',
shape: {
api,
xValue: api.value(0),
yValue: api.value(1),
x: location[0],
y: location[1],
xAxisPoint: api.coord([api.value(0), 0])
},
style: {
fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#3B80E2'
},
{
offset: 1,
color: '#49BEE5'
}
])
}
}]
}
},
data: VALUE
}, {
type: 'bar',
label: {
normal: {
show: true,
position: 'top',
formatter: (e) => {
switch (e.name) {
case '10kV线路':
return VALUE[0]
case '公用配变':
return VALUE[1]
case '35kV主变':
return VALUE[2]
case '水':

}
},
fontSize: 16,
color: '#38ff9f',
offset: [4, -25]
}
},
itemStyle: {
color: 'transparent'
},
data: MAX
}]
}
myChart.setOption(option);
}
})
})
</script>



标签:七天,task,java,value,查询,shape,api,const
From: https://blog.51cto.com/u_15948415/6027762

相关文章

  • 基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现
    文章目录​​基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现​​​​一、前言介绍:​​​​二、系统设计:​​​​2.1性能需求分析​​​​2.2B/S架构......
  • java springboot+mybatis电影售票网站管理系统前台+后台设计和实现
    文章目录​​javaspringboot+mybatis电影售票网站管理系统前台+后台设计和实现​​​​主要技术框架:spring、springmvc、springboot、mybatis、jquery、templates模板......
  • java selenium demo
    importjava.util.Arrays;importjava.util.List;importjava.util.concurrent.TimeUnit;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.C......
  • java day1
    如何判断+号是连接还是相加,如果有string类型就是连接;......
  • java.lang.NumberFormatException: multiple points报错
    记录一下今天出现的问题,前端页面点击本周或本月时,会报一个multiplepoints的错误,起初我以为是我后端接收与前端传的类型不符,后面查了一下才发现,是因为SimpleDateFormat......
  • javaScript一个数组对象根据另一个数组排序
    varlist=[{name:'上海',code:'shanghai',},{name:'西安',code:'xian'},{name:'深圳',code:'shenzhen'},{name:'北京',code:'beijing'}];list......
  • MySql慢查询
    一、简介开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。开发环境建议一直开启便与优化生成环境建议关......
  • JavaScript学习笔记—DOM之文本节点
    在DOM中,文本内容也是一个节点对象(Text),可以通过获取文本对象然后完成对它的各种操作,但这种做法会使得事情变得复杂,并不建议这么做。在大部分场景下,可以通过元素的属性来操作......
  • java 两个时间类型的参数相减,得到相差的天数
    如下代码演示当天时间减去一个时间参数获得两者之间相差的天数//获得Date类型的参数DatestartTime=entity.getCrateTime();DateendTime=newDate(System.currentT......
  • Java File IO
    一、File二、Java流分类三、文件的读写1.使用FileInputStream读文本文件2.使用FileOutputStream读写文本文件3.使用BufferedReader读写文本文件4.......