前言

报表需要获取当前时间下的区间季度,不是常规的Q1,Q2这种,网上想找类似例子没找到,索性自己写一个。
举例

        log.info(getQuarterByDate("2021-2", "2022-2", 1).toString());log.info(getQuarterByDate("2021-2", "2021-2", 1).toString());log.info(getQuarterByDate("2021-4", "2021-8", 1).toString());log.info(getQuarterByDate("2021-8", "2021-9", 1).toString());log.info(getQuarterByDate("2021-3", "2022-3", 1).toString());log.info(getQuarterByDate("2021-2", "2022-2", 2).toString());log.info(getQuarterByDate("2021-2", "2021-2", 2).toString());log.info(getQuarterByDate("2021-4", "2021-8", 2).toString());log.info(getQuarterByDate("2021-8", "2021-9", 2).toString());log.info(getQuarterByDate("2021-3", "2022-3", 2).toString());log.info(getQuarterByDate("2021-2", "2022-2", 3).toString());log.info(getQuarterByDate("2021-2", "2021-2", 3).toString());log.info(getQuarterByDate("2021-4", "2027-8", 3).toString());log.info(getQuarterByDate("2021-8", "2021-9", 3).toString());log.info(getQuarterByDate("2021-3", "2022-3", 3).toString());

==>>输出为
不足一个季度按照开始时间到当前季度结束时间为准,同理半年和年均这样

[2021-2~3, 2021-Q2, 2021-Q3, 2021-Q4, 2022-1~2]
[2021-2]
[2021-Q2, 2021-7~8]
[2021-8~9]
[2021-3, 2021-Q2, 2021-Q3, 2021-Q4, 2022-Q1]
[2021-H1, 2021-H2, 2022-H1]
[2021-H1]
[2021-H1, 2021-H2]
[2021-H2]
[2021-H1, 2021-H2, 2022-H1]
[2021, 2022]
[2021]
[2021, 2022, 2023, 2024, 2025, 2026, 2027]
[2021]
[2021, 2022]

工具类

    /*** 获取两个时间 的 区间季度* @param startTime 开始时间* @param endTime 结束时间* @param type 查询类型 1 季度 2半年 3 年* @return* @Author HezhezhiyuLe* @throws ParseException*/public static List<String> getQuarterByDate(String startTime, String endTime, Integer type) throws ParseException {//返回语句数组List<String> quartersStr = new ArrayList();DateFormat df = new SimpleDateFormat("yyyy-MM");//获取开始结束的日历类Calendar cal = Calendar.getInstance();cal.setTime(df.parse(startTime));Calendar cal1 = Calendar.getInstance();cal1.setTime(df.parse(endTime));int startMonth = 0;//获取所有不重复月份对象数据List<TestDate> arr1 = new ArrayList<>();//比较时间while (cal1.getTime().after(cal.getTime()) || cal1.getTime().equals(cal.getTime())) {TestDate testDate = new TestDate();//程序中月份11月封顶startMonth = cal.get(Calendar.MONTH);testDate.setMonth(startMonth);testDate.setYear(cal.get(Calendar.YEAR));switch (startMonth) {case 0:case 1:case 2:testDate.setQuarter(1);break;case 3:case 4:case 5:testDate.setQuarter(2);testDate.setHalfyear(1);break;case 6:case 7:case 8:testDate.setQuarter(3);break;case 9:case 10:case 11:testDate.setQuarter(4);testDate.setHalfyear(6);break;}arr1.add(testDate);//递增一月cal.add(Calendar.MONTH, 1);}// 年 季度 月 表述关系 选择有序MAPMap<Integer, Map<Integer, List<TestDate>>> countsYears = new TreeMap<>();//按季度分对象for (TestDate testDate : arr1) {//获取当前月所属季度int quarter = testDate.getQuarter();int year = testDate.getYear();//存储 季度 月Map<Integer, List<TestDate>> YMQ = countsYears.get(year);if (YMQ == null) {// 季度月Map<Integer, List<TestDate>> MQ = new TreeMap<>();//单月List<TestDate> arr = new ArrayList<>();arr.add(testDate);MQ.put(quarter, arr);countsYears.put(year, MQ);} else {List<TestDate> testDates = YMQ.get(quarter);if (testDates == null) {List<TestDate> arr = new ArrayList<>();arr.add(testDate);YMQ.put(quarter, arr);} else {testDates.add(testDate);YMQ.put(quarter, testDates);}}}//遍历当前年份 不重复for (Integer year : countsYears.keySet()) {//获得当前年的所有季度月Map<Integer, List<TestDate>> quarterMonths = countsYears.get(year);if(type==3){quartersStr.add(year);continue;}for (Integer quarter : quarterMonths.keySet()) {//获取当前季度 月份数组List<TestDate> testDates = quarterMonths.get(quarter);if (testDates == null) {continue;}//当前月 不重复TestDate testDate = testDates.get(0);//替换为12进制int nowMonth = testDate.getMonth() + 1;switch (type){//季度算法case 1://满3个月算一季度 Q1if (testDates.size() == 3) {quartersStr.add(year + "-Q" + quarter);} else if (testDates.size() == 1) {//只有一个月算当月 1quartersStr.add(year + "-" + nowMonth);} else if (testDates.size() == 2) {//一个季度中有两月算区间 2-3quartersStr.add(year + "-" + nowMonth + "~" + (testDates.get(1).getMonth() + 1));}break;// 半年算法case 2://不添加重复半年 上半年H1 下半年H2if (quarter<=2) {String halfYearStr=year + "-H1";if(!quartersStr.contains(halfYearStr)){quartersStr.add(halfYearStr);}} else if (quarter>2) {String halfYearStr=year + "-H2";if(!quartersStr.contains(halfYearStr)){quartersStr.add(halfYearStr);}}break;}}}//返回组合语句 2021-2~3, 2021-Q2, 2021-Q3, 2021-Q4, 2022-1~2return quartersStr;}

package cn.ways.app.product.util;public class TestDate {//月private int month;//季private int quarter;//年private int year;//半年private int halfyear;public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getQuarter() {return quarter;}public void setQuarter(int quarter) {this.quarter = quarter;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getHalfyear() {return halfyear;}public void setHalfyear(int halfyear) {this.halfyear = halfyear;}@Overridepublic String toString() {return "TestDate{" +"month=" + month +", quarter=" + quarter +", year=" + year +", halfyear=" + halfyear +'}';}
}

SQL举例

         <isEqual property="dateType" compareValue="quarter">select case when counts = 3 then year||'-Q'||quarterwhen counts = 1 then year||'-'||monthelse year||' '||minMonth||'-'||maxmonthend showTitle,dense_rank() over(order by YEAR,quarter) rn,a.*from (select YM, YEAR, MONTH, QUARTER,count(1) over(partition by YEAR, QUARTER) counts,max(month) over(partition by YEAR, QUARTER) maxMonth,min(month) over(partition by YEAR, QUARTER) minMonthfrom (select distinct year||lpad(month,2,0) ym,year,month,case when month between 1 and 3 then 1when month between 4 and 6 then 2when month between 7 and 9 then 3when month between 10 and 12 then 4end quarterfrom dm_datewhere year||lpad(month,2,0) between $beginDate$ and $endDate$)) a</isEqual>

附图:珠峰

获取两个时间区间季度Q半年H年Y相关推荐

  1. c# 获取两个时间之间的时间差

    c# 获取两个时间之间的时间差(时.分.秒) public static string GetTime(DateTime timeA){//timeA 表示需要计算DateTime timeB = D ...

  2. 判断两个时间区间是否存在交集-Java实现

    以下demo用于判断两个时间区间是否存在交集. 代码如下: ============================================================== package ...

  3. 获取两个时间之间的间隔_花了两天,终于把 Python 的时间转化给整明白了(超多图解)...

    来源:Python编程时光(未经授权不得私自转载) Python 的时间转化,我相信是很多开发者的痛.学得慢,忘得快,一到要用就去百度,效率太低.建议收藏这些文章(但也别忘了点赞呐,求你了),需要的时 ...

  4. java获取两个时间之间的所有日期、月份、年份,返回列表

     需求描述 输入开始时间和结束时间,获取时间范围内的所有日期,月份.年份     (输入可以为"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd&quo ...

  5. java获取两个时间的间隔天数_java获取两日期的间隔天数

    这是我程序中用到的方法,传入的日期格式,可根据本身的须要做相应的改变.java /** * 读取两个日期之间的天数 * @param begin yyyy-mm-dd * @param end yyy ...

  6. golang 获取两个时间 相差多少 小时

    实例如下: package mainimport ("fmt""time" )func main() {fmt.Println(getHourDiffer(&q ...

  7. python使用datetime获取两个时间的时间差,与时间的加减运算

    设置指定日期为datatime格式:datetime(2020, 1, 1),表示2020年1月1日 设置指定的时间差:datetime.timedelta(days=2),表示两天的时间差 时间差是 ...

  8. java判断两个时间区间是否有重合

    /* 开始时间 */Date leftStartDate = pojo.getStartDate();/* 结束时间 */Date leftEndDate = pojo.getDeadlineDate ...

  9. js获取传统节假日_js 两个时间之间工作日的计算问题(包含节假日)

    后端用vue写点前端代码,也是罪过...嗷嗷嗷  行吧 项目需求描述:需要对时间控件里面的两个时间计算出相隔多少个工作日(包含节假日),由于节假日每年都不确定.保证项目能够正常使用,录用了2018年和 ...

最新文章

  1. RTX2013和微信企业号打通
  2. sqlmap写文件为空之谜
  3. Android之四大组件(AIDL Service的使用)
  4. 微软宣布在Azure API管理中预览OpenAPI规范V3
  5. 全程图解交换机和路由器的应用
  6. 微软 MVP 福利大赏
  7. Class的getName、getSimpleName与getCanonicalName的区别
  8. 使用jstack查看某个Java进程内的线程堆栈信息
  9. 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
  10. linux性能分析工具集(图示)
  11. python 写入文件编码_使用Python写入文本文件时的编码问题
  12. mysql修改服务器ip,mysql数据库修改服务器ip
  13. 程序员如何从技术上“开挂”魔卡手游? | 技术头条
  14. VS2015 vs2017 密钥
  15. 《Gradle实战》如何配置利用Maven本地仓库
  16. 本地开发H5页面如何发版成为微信公众号?
  17. 图解敏捷教练和 ScrumMaster
  18. 网站自动回复客服源码
  19. 车秘android版本最新版本,车秘下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
  20. hdu5769Substring

热门文章

  1. 163邮箱移动办公软件平台,移动办公云邮箱哪个好?
  2. 网上的小段子,自己搞笑一下呵呵~~~
  3. Python简单又好玩的项目推荐!【持续更新】
  4. JS数组移除元素的方法
  5. ajax同步和异步请求的区别
  6. 如何利用开发者账号重签ipa文件,并部署到IOS设备做测试搜索
  7. 盘点2017八大网购电商平台
  8. Mac电脑设置长时间不用自动退出登录
  9. leaflet常用插件库
  10. 字节跳动公司创新分析 —— By BUPT 7xun