Java计算同比环比
同比环比计算基本概念和计算公式
同比率:本年数据比上一年数据增长或减少的比率
同比率计算公式:rate = (本年数据 - 前一年数据) / 前一年数据
实例:2020年10月游客数量为80W,2019年10月游客数量为100W,2018年10月游客数量为90W
2020年同比率为:rate :(80 - 100)/100 * 100%= -20%
2019年同比率为:rate :(100 - 900)/900 * 100%= +11%
(“+” 为增长,“-”为降低)

环比率:本月(季度)数据比上个月(季度)数据增长或减少的比率
环比率计算公式:rate = (本月数据 - 上个月数据) / 上个月数据
实例:2020年10月游客数量为100W,2020年9月游客数量为90W,2020年7月游客数量为80W
2020年10月同比率为:rate :(100 - 90)/90 * 100%= +11%
2019年10月同比率为:rate :(90- 80)/800 * 100%= +12.5%
注:同比环比计算公式是相同的,但计算数据对应的时间是不同的

代码实现逻辑
通过Calendar等时间函数和HashMap,[ hashmap(key,value) key为时间,value为该时间对应的值]。将key和value一一对应的存入集合中,通过对key进行操作,再用key获取HashMap中相对应的value,套公式计算(重点在于对时间(key)的操作,通过key可直接获取value进行计算)

详细逻辑步骤
首先通过SQL语句获取数据库中相应的时间和该时间对应的数据,按时间分组排序

SELECTDATAS.DATE AS NAME ,SUM( DATAS.VISITORSUM) AS VALUE,2 AS sfzj,'' AS bfbFROM(SELECT TOURIST.* ,CONCAT(YEAR,'年',QUARTER,'月') AS DATEFROM TOURISTFLOW TOURIST)DATASGROUP BY DATAS.DATEORDER BY DATAS.DATE

接着设置时间范围,将最早的时间减去一年设为最小时间,最后的时间为最大时间,以此为范围即可保证覆盖所有数据

// 设置时间范围// 获取最前的时间的第一个列表analyzeBean firstTimeSubway = analyzeByYear.get(0);String startTime = firstTimeSubway.getTime();// 获取最后时间的最后一个列表analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1);String endTime = endTimeSubway.getTime();// 时间格式转换SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月");Date parse = format.parse(startTime);Date parse1 = format.parse(endTime);Calendar c = Calendar.getInstance();c.setTime(parse);c.add(Calendar.YEAR, -1);Date y = c.getTime();// 获取最前的时间的前一年的时间作为查询范围String firstTime = format.format(y);analyzeRequestBean.setStartTime(firstTime);Calendar c1 = Calendar.getInstance();c1.setTime(parse1);Date y1 = c1.getTime();// 获取最后一年的时间作为查询范围String lastTime = format.format(y1);analyzeRequestBean.setStartTime(lastTime);

在将所有数据的结果集存入HashMap中 hash(key,value) key为时间,value为数据值

hashMap.put(time, analyzeByYear.get(i).getValue());

最后通过for循环和CaleCndar函数和Date函数对时间(key)进行相应的操作,再通过时间(key)到HashMap中找对应的值进行计算

for (int i = 0; i < analyzeByYear.size(); i++) {AnalyzeBean analyzeBean = analyzeByYear.get(i);if (i == 0) {// 是否增长("0:降低 1:增加 2:既不增长也不降低")analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月");// 当前数据Date parse2 = format2.parse(analyzeBean.getTime());Calendar c2 = Calendar.gaetInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format2.format(t);Integer value = hashMap.get(time);// 往年数据Date parse3 = format2.parse(time);Calendar c3 = Calendar.getInstance();c3.setTime(parse3);c3.add(Calendar.YEAR, -1);Date year = c3.getTime();String time1 = format2.format(year);Integer value1 = hashMap.get(time1);if (null != value1 && null != value) {if (value.equals(value1)) {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {if (value > value1) {analyzeBean.setSfzj(1);} else {analyzeBean.setSfzj(0);}// 2个值减法 绝对值int abs = Math.abs(value - value1);float a = (float) (abs) / (float) value1 * 100;analyzeBean.setBfb(a + "");}} else {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);}}}

同比实例代码:

// 求同比@Overridepublic Result getAnalyzeByYear(AnalyzeRequestBean analyzeRequestBean) {try {// 检查参数if (null == analyzeRequestBean) {return ResultUtil.fail(ResultEnum.PARAMS_ERROR);}
aList<AnalyzeBean> analyzeByYear= InfoMapper.getAnalyzeByYear(analyzeRequestBean);if (analyzeByYear == null || analyzeByYear.size() == 0) {return ResultUtil.ok(null);}// 设置时间范围// 获取最前的时间的第一个列表analyzeBean firstTimeSubway = analyzeByYear.get(0);String startTime = firstTimeSubway.getTime();// 获取最后时间的最后一个列表analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1);String endTime = endTimeSubway.getTime();// 时间格式转换SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月");Date parse = format.parse(startTime);Date parse1 = format.parse(endTime);Calendar c = Calendar.getInstance();c.setTime(parse);c.add(CaleCndar.YEAR, -1);Date y = c.getTime();// 获取最前的时间的前一年的时间作为查询范围String firstTime = format.format(y);analyzeRequestBean.setStartTime(firstTime);Calendar c1 = Calendar.getInstance();c1.setTime(parse1);Date y1 = c1.getTime();// 获取最后一年的时间作为查询范围String lastTime = format.format(y1);analyzeRequestBean.setStartTime(lastTime);// 把大范围的结果集都放入hashMap中HashMap<String, Integer> hashMap = new HashMap<>();for (int i = 0; i < analyzeByYear.size(); i++) {analyzeBean analyzeBean = analyzeByYear.get(i);SimpleDateFormat format1 = new SimpleDateFormat("yyyy年MM月");Date parse2 = format1.parse(analyzeBean.getTime());Calendar c2 = Calendar.getInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format1.format(t);hashMap.put(time, analyzeByYear.get(i).getValue());}for (int i = 0; i < analyzeByYear.size(); i++) {AnalyzeBean analyzeBean = analyzeByYear.get(i);if (i == 0) {// 是否增长("0:降低 1:增加 2:既不增长也不降低")analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月");// 当前数据Date parse2 = format2.parse(analyzeBean.getTime());Calendar c2 = Calendar.gaetInstance();c2.setTime(parse2);c2.add(Calendar.YEAR, 0);Date t = c2.getTime();String time = format2.format(t);Integer value = hashMap.get(time);// 往年数据Date parse3 = format2.parse(time);Calendar c3 = Calendar.getInstance();c3.setTime(parse3);c3.add(Calendar.YEAR, -1);Date year = c3.getTime();String time1 = format2.format(year);Integer value1 = hashMap.get(time1);if (null != value1 && null != value) {if (value.equals(value1)) {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);} else {if (value > value1) {analyzeBean.setSfzj(1);} else {analyzeBean.setSfzj(0);}// 2个值减法 绝对值int abs = Math.abs(value - value1);float a = (float) (abs) / (float) value1 * 100;analyzeBean.setBfb(a + "");}} else {analyzeBean.setSfzj(2);analyzeBean.setBfb(null);}}}return ResultUtil.ok(analyzeByYear);} catch (ParseException ex) {ex.printStackTrace();}return ResultUtil.ok(null);

环比类似,只是把c.add(Calendar.YEAR, 0);换成c.add(Calendar.MONTH, 0)
实现逻辑其实不难,只是我写复杂了,如有更好的方法欢迎留言交流讨论## Java计算同比环比

Java计算同比环比相关推荐

  1. 【Mysql实战】使用存储过程和计算同比环比

    背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...

  2. java时间计算同比环比周的问题

    问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...

  3. Oracle如何根据一个日期计算同比环比的日期

    iamlaosong文 在写统计查询的SQL语句时,经常会碰到根据一个查询日期推演其它日期的问题,如同比.环比等. 1.字符串转换成日期:to_date('2016-6-16', 'yyyy-mm-d ...

  4. 计算同比 环比_PowerBI学习教程(三)时间累积同比环比计算

    YOY 同比增长率( Year Over Year): 按年度计的增长率 MOM 环比增长率 (Month Over Month): 按月度计的增长率 YTD 年累计 (Year to Date): ...

  5. 同比环比日期计算、本周一、本周日、上周一、上周日(mysql)

    目录 1 所需基础日期查询实现 2 根据业务表实际查询操作 2.1 简单查询 2.2 查询优化: 2.3  在mybatis中 查询,关联业务信息实现 1 所需基础日期查询实现 (1)在计算同比环比时 ...

  6. 怎么做蒙特卡洛计算npv_PowerBI非标准日历下的同比环比计算,你知道怎么做吗?...

    ​对于按照自然年月日来分析的业务数据,在PowerBI中可以轻松的使用时间智能函数来进行各种时间指标的计算,但如果不是按标准的日历,很多人就开始有点懵,不知道该如何计算了. 比如有的公司的业务月份是从 ...

  7. SQL计算日环比、周同比

    计算日环比.周同比 范例表格如下: 这是面试问到的一个问题,回来学习之后了解可以用这个函数: 计算日活的日环比,周同比: 代码如下: select date,dau,(dau-dau_1)/dau_1 ...

  8. Power BI中计算同比、环比

    财务需求中经常要求计算数据的同比.环比,下面介绍如何在Power BI 中创建用来计算同比和环比的度量值(SSAS模型中同理)... 现金表中有金额,时间(时间需要连续的年月日格式),计算同比.环比. ...

  9. 计算同比、环比的一些常识性问题

    什么鬼 我想在这篇文章中说明的是在计算同比.环比的值的时候,会遇到的一些问题.这些问题如下: 环比月天数不一致 同比周数不一致 可比&全同比 在这一小节里面,我先不说上面的四个问题,我想说的是 ...

  10. ORACLE 计算某个变量的同比环比

    计算同比.环比是数据分析工作中常见的工作,虽然理论简单,但是sql计算还是有点繁琐,先把我提炼出来的模板总结如下,方便日后直接使用. select b1.唯一标识,b1.目标年月,b1.变量,roun ...

最新文章

  1. 2022-2028年中国完全生物降解塑料产业发展动态及投资前景预测报告
  2. 参照WebStorm设置VSCode快捷键Alt+Enter快速修复部分报错代码(默认是Ctrl+.)
  3. android 星星流逝动画,Android Loading动画分析--续集
  4. hdu2167 方格取数 状态压缩dp
  5. 桌面图标计算机的意义,关于电脑桌面图标的3个古老问题,答对一个都是高手,你会几个?...
  6. C#委托,事件理解入门 (译稿)
  7. android 生成apk名字自动已,Jenkins打包android应用时自动签名apk详解
  8. 几种常见的跨域原理的实现
  9. 一款轻量级android图表组件SimpleChart-Kotlin
  10. VB编程的RS485通讯操作界面源码 本程序适应各类带RS485通讯的设备,参数可以自由修改,主要是针对各类变频器RS485通讯(RTU)格式!
  11. postgresql如何优雅地清理磁盘空间碎片VACUUM
  12. excel中使用vlookup函数筛选时遇到#N/A 错误
  13. wireshark抓取手机app包
  14. C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)
  15. 解决office的PPT和WPS的PPT不兼容的问题
  16. js数组拆分成几个数组
  17. 64位win7下安装keras的过程
  18. linux系统的wps办公软件,wps32位/64位linux版办公软件-WPS Office 2019 For Linux下载V11.1.0.10161官方版-西西软件下载...
  19. 云原生之docker详细知识技能介绍与实战
  20. python的积木式编程

热门文章

  1. 抖音的服务器究竟有多大?
  2. Java 采用MD5加密解密
  3. Win11将输入法的繁体改为简体
  4. oracle自增序列
  5. 谷歌浏览器启动后,图标变成空白解决办法
  6. 华为鸿蒙系统支持5g吗,华为新机入网:预装鸿蒙OS 不支持5G网络
  7. 如何确保运维数据安全
  8. 计算机主机号截图,电脑如何截图?截图三种方法推荐
  9. python抓取网易云音乐评论_Python 爬取网易云音乐评论
  10. 生成式模型和判别式模型的区别