记录一个需求:折线图,要求指定年份每一天的记录
根據(jù)自己的業(yè)務(wù)去修改,本文提供參考思路
首先:需求是要求指定年份每一天的價(jià)格,沒(méi)有則補(bǔ)全并賦值日期之前最近的一次價(jià)格
有一個(gè)主表(主表中有id和價(jià)格)
子表中有主表的id和價(jià)格
主表價(jià)格更改,就需要向字表中添加一條數(shù)據(jù)
如下表:
解決方案1:設(shè)置定時(shí)任務(wù),在每晚的12點(diǎn)去主表查詢(xún)價(jià)格,然后向子表添加一條記錄,如果當(dāng)天已經(jīng)存在記錄就不在添加
問(wèn)題:如果一天更改兩次價(jià)格,子表中將會(huì)存在兩個(gè)記錄?
這個(gè)問(wèn)題是這樣解決的,更改的時(shí)候去邏輯刪除子表中的這一天的記錄,再去添加,保證,一天只有一條數(shù)據(jù),邏輯刪除的意義在于客戶(hù)需要所有的記錄可以都拿的出來(lái)
這樣也是一個(gè)實(shí)現(xiàn)的思路,查詢(xún)折線(xiàn)圖的時(shí)候,直接獲取未被邏輯刪除的就是每一天的數(shù)據(jù),
但我是另一種方式
解決方案二:
思路如下:
按年查詢(xún)升序
其中用到的方法:
1.判斷時(shí)間是否在時(shí)間段內(nèi)
2.生成指定年份的每一天
/*** 生成指定年的每一天* @param year* @return*/public static List<String> getDaysByYear(int year){Calendar c=Calendar.getInstance();List<String> dates=new ArrayList<String>();for(int i=0;i<12;i++){c.set(year,i,1);int lastDay=c.getActualMaximum(Calendar.DATE);for(int j=1;j<=lastDay;j++){String month="";String day="";if(i<9) month="-0"+(i+1);else month="-"+(i+1);if(j<10) day="-0"+j;else day="-"+j;String date=year+month+day;dates.add(date);}}return dates;}3.字符串轉(zhuǎn)日期格式
// 字符串 轉(zhuǎn) 日期public static Date strToDate(String str) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = null;try {date = sdf.parse(str);} catch (ParseException e) {}return date;}效果如下
出現(xiàn)了新的問(wèn)題
如果遇到上一年有記錄,但這一年的記錄是11月9號(hào)的,那就會(huì)存在一個(gè)問(wèn)題,
返回的數(shù)據(jù)只是這一年11月9號(hào)之后的,之前并沒(méi)有數(shù)據(jù),所以需要改進(jìn)
解決方案:
查詢(xún)到這一年記錄后判斷這一年是否有記錄
沒(méi)有則查詢(xún)這一年第一天之前數(shù)據(jù)庫(kù)最近的一條記錄,并將給一年賦值
查詢(xún)的sql語(yǔ)句如下:
其中指定日期就是指定年份的第一天(可以通過(guò)如下方法獲取,傳年,傳月,返回第一天)
/*** 獲取該月的第一天** @param year 年* @param month 月* @return*/public static Date getFirstDay(int year, int month) {Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);// 設(shè)置月份,因?yàn)樵路輳?開(kāi)始,所以用month - 1c.set(Calendar.MONTH, month - 1);c.set(Calendar.DAY_OF_MONTH, 1);Date time = c.getTime();SimpleDateFormat slf = new SimpleDateFormat("yyyy-MM-dd");String format = slf.format(time);try {return slf.parse(format);} catch (ParseException e) {e.printStackTrace();}return null;}這是這一年都沒(méi)有記錄的情況
下面是這一年中有記錄
分兩步,文章最開(kāi)始已經(jīng)將存在日期之后的數(shù)據(jù)賦值了為第二步
在之前添加第一步:
拿到指定年份中的歷史數(shù)據(jù)之后 獲取第一條數(shù)據(jù)
因?yàn)閟ql是ASC升序的,所以獲取的第一條就是這一年的第一條數(shù)據(jù),
根據(jù)這一年的第一條數(shù)據(jù)的日期去查詢(xún)這之前數(shù)據(jù)庫(kù)最近的一條記錄
給這一年存在日期之前的數(shù)據(jù)賦值
這樣就解決了
查詢(xún)的sql還是上面那條,哪里的指定日期改為這里第一條數(shù)據(jù)的日期就可以了
成品如下:
本以為結(jié)束了,又有新的問(wèn)題,查詢(xún)的數(shù)據(jù)如果是今年的應(yīng)該查詢(xún)的今天,而我所查詢(xún)出來(lái)的只截止到最后一天
使用到的方法getLastDay,根據(jù)年月獲取這個(gè)月第一天,最后一天
最終版的代碼如下:
public ReportResultVo getPrice(Long id, int years) {//每一天List<String> daysByYears = DateUtils.getDaysByYear(years);//返回結(jié)果ReportResultVo reportResultVo = new ReportResultVo();ArrayList<String> xData = new ArrayList<>();ArrayList<Long> yData = new ArrayList<>();// 指定年份中的歷史價(jià)格List<GasSourcePrice> gasSourcePrices = gasSourcePriceMapper.selectGasSourcePriceByGasSourceId(id, years);if (gasSourcePrices.size() > 0) {//判斷是否是今年if (DateUtils.isNowYear(years)){//是今年則補(bǔ)全最后一條記錄至今的數(shù)據(jù)GasSourcePrice gasSourcePrice = new GasSourcePrice();BeanUtils.copyProperties(gasSourcePrices.get(gasSourcePrices.size()-1),gasSourcePrice);gasSourcePrice.setCreateTime(DateUtils.getNowDate());gasSourcePrices.add(gasSourcePrice);}else {//不是今年,補(bǔ)全到年的最后一天GasSourcePrice gasSourcePrice = new GasSourcePrice();BeanUtils.copyProperties(gasSourcePrices.get(gasSourcePrices.size()-1),gasSourcePrice);gasSourcePrice.setCreateTime(DateUtils.getLastDay(years,12));gasSourcePrices.add(gasSourcePrice);}//查詢(xún)?cè)撃攴葜暗淖罱粭l記錄,賦值給該年份第一條記錄之前的日期//獲取該年份第一條數(shù)據(jù)GasSourcePrice gasSourcePriceOne = gasSourcePrices.get(0);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");String dateOne = simpleDateFormat.format(gasSourcePriceOne.getCreateTime());//查詢(xún)?cè)撃攴葜白罱囊粭l記錄GasSourcePrice gasSourcePrice = gasSourcePriceMapper.selectGasSourcePriceByDate(id,dateOne);if (StringUtils.isNotNull(gasSourcePrice)) {Date date1 = gasSourcePrice.getCreateTime();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String format1 = sdf.format(date1);Date beginTime = DateUtils.strToDate(format1);Date date2 = gasSourcePriceOne.getCreateTime();String format2 = sdf.format(date2);Date endTime = DateUtils.strToDate(format2);for (int i = 0; i < daysByYears.size(); i++) {Date date = DateUtils.strToDate(daysByYears.get(i));if (DateUtils.belongCalendar(date, beginTime, endTime)) {if (!xData.contains(sdf.format(date))) {xData.add(sdf.format(date));}yData.add(gasSourcePrice.getPrice().longValue());} else {continue;}}}//賦值給該年份查詢(xún)到第一條和最后一條之間的日期for (int x = 0; x < gasSourcePrices.size(); x++) {int next = 0;if (x + 1 < gasSourcePrices.size()) {next = x + 1;} else {next = x;}GasSourcePrice gas = gasSourcePrices.get(x);Date date1 = gas.getCreateTime();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String format1 = sdf.format(date1);Date beginTime = DateUtils.strToDate(format1);GasSourcePrice gasSourcePriceNext = gasSourcePrices.get(next);Date date2 = gasSourcePriceNext.getCreateTime();String format2 = sdf.format(date2);Date endTime = DateUtils.strToDate(format2);for (int i = 0; i < daysByYears.size(); i++) {log.info(daysByYears.get(i));Date date = DateUtils.strToDate(daysByYears.get(i));if (DateUtils.belongCalendar(date, beginTime, endTime)) {if (!xData.contains(sdf.format(date))) {xData.add(sdf.format(date));}yData.add(gas.getPrice().longValue());} else {continue;}}}} else if (gasSourcePrices.size() == 0) {//這一年沒(méi)有記錄 查之前的記錄 并賦值給這一年Date day = DateUtils.getFirstDay(years, 1);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String format1 = sdf.format(day);//查詢(xún)?cè)撃攴葜白罱囊粭l記錄GasSourcePrice gasSourcePrice = gasSourcePriceMapper.selectGasSourcePriceByDate(id, format1);if (StringUtils.isNotNull(gasSourcePrice)) {for (int i = 0; i < daysByYears.size(); i++) {log.info(daysByYears.get(i));yData.add(gasSourcePrice.getPrice().longValue());if (daysByYears.get(i).equals(DateUtils.getDate())){break;}}}xData.addAll(daysByYears);}reportResultVo.setXData(xData);reportResultVo.setYData(yData);return reportResultVo;}總結(jié)
以上是生活随笔為你收集整理的记录一个需求:折线图,要求指定年份每一天的记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 股票评级级别顺序
- 下一篇: idea2020搜索不到插件的问题