获取两个时间区间季度Q半年H年Y
前言
报表需要获取当前时间下的区间季度,不是常规的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相关推荐
- c# 获取两个时间之间的时间差
c# 获取两个时间之间的时间差(时.分.秒) public static string GetTime(DateTime timeA){//timeA 表示需要计算DateTime timeB = D ...
- 判断两个时间区间是否存在交集-Java实现
以下demo用于判断两个时间区间是否存在交集. 代码如下: ============================================================== package ...
- 获取两个时间之间的间隔_花了两天,终于把 Python 的时间转化给整明白了(超多图解)...
来源:Python编程时光(未经授权不得私自转载) Python 的时间转化,我相信是很多开发者的痛.学得慢,忘得快,一到要用就去百度,效率太低.建议收藏这些文章(但也别忘了点赞呐,求你了),需要的时 ...
- java获取两个时间之间的所有日期、月份、年份,返回列表
需求描述 输入开始时间和结束时间,获取时间范围内的所有日期,月份.年份 (输入可以为"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd&quo ...
- java获取两个时间的间隔天数_java获取两日期的间隔天数
这是我程序中用到的方法,传入的日期格式,可根据本身的须要做相应的改变.java /** * 读取两个日期之间的天数 * @param begin yyyy-mm-dd * @param end yyy ...
- golang 获取两个时间 相差多少 小时
实例如下: package mainimport ("fmt""time" )func main() {fmt.Println(getHourDiffer(&q ...
- python使用datetime获取两个时间的时间差,与时间的加减运算
设置指定日期为datatime格式:datetime(2020, 1, 1),表示2020年1月1日 设置指定的时间差:datetime.timedelta(days=2),表示两天的时间差 时间差是 ...
- java判断两个时间区间是否有重合
/* 开始时间 */Date leftStartDate = pojo.getStartDate();/* 结束时间 */Date leftEndDate = pojo.getDeadlineDate ...
- js获取传统节假日_js 两个时间之间工作日的计算问题(包含节假日)
后端用vue写点前端代码,也是罪过...嗷嗷嗷 行吧 项目需求描述:需要对时间控件里面的两个时间计算出相隔多少个工作日(包含节假日),由于节假日每年都不确定.保证项目能够正常使用,录用了2018年和 ...
最新文章
- RTX2013和微信企业号打通
- sqlmap写文件为空之谜
- Android之四大组件(AIDL Service的使用)
- 微软宣布在Azure API管理中预览OpenAPI规范V3
- 全程图解交换机和路由器的应用
- 微软 MVP 福利大赏
- Class的getName、getSimpleName与getCanonicalName的区别
- 使用jstack查看某个Java进程内的线程堆栈信息
- 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
- linux性能分析工具集(图示)
- python 写入文件编码_使用Python写入文本文件时的编码问题
- mysql修改服务器ip,mysql数据库修改服务器ip
- 程序员如何从技术上“开挂”魔卡手游? | 技术头条
- VS2015 vs2017 密钥
- 《Gradle实战》如何配置利用Maven本地仓库
- 本地开发H5页面如何发版成为微信公众号?
- 图解敏捷教练和 ScrumMaster
- 网站自动回复客服源码
- 车秘android版本最新版本,车秘下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
- hdu5769Substring