sql(达梦数据库)获取本周所有数据(周一至周日,周一至所选当前时间所有数据)、获取上周所有数据,获取近一段时间内的日期,和本月的日期

33 篇文章 1 订阅
8 篇文章 0 订阅

sql(达梦数据库)获取本周所有数据(周一至周日)、获取上周所有数据,获取近一段时间内的日期,和本月的日期
废话不多说,直接上图:
图一: 本周所有数据

SELECT
	      INDUSTRY_NAME industryName,
	      SUM(COUNT_NUM) heatValue
	  FROM GFACE_INDUSTRY_DAILY_STAT
	  WHERE SRC_TYPE = #{type} AND datediff(WEEK,#{year},DATE) = 0
	  GROUP BY INDUSTRY_NAME
	  ORDER BY SUM(COUNT_NUM) DESC

图二:上周所有数据

SELECT
	      INDUSTRY_NAME industryName,
	      SUM(COUNT_NUM) heatValue
	  FROM GFACE_INDUSTRY_DAILY_STAT
	  WHERE SRC_TYPE = #{type} AND datediff(WEEK,#{year},DATE) = -1
	  GROUP BY INDUSTRY_NAME
	  ORDER BY SUM(COUNT_NUM) DESC

SRC_TYPE = #{type} :这个为其他条件不用管,最主要的是后面时间处理上 #{year}:为传入时间
=0:为本周、= -1 为上周、依次类推


经验证,以下方法不合适、以上方法为正确方法,适用于达梦数据库。

上面的获取本周、上周数据有一点小缺陷,但凡传入日期当天是星期天,这个时候数据会把当天的数据计算到下周的数据里面(其他日期正常计算周一至周日数据)。
现修改如下,问题解决

<!--查询本周热度值-->
  <select id="selectCounts"
          resultType="com.screen.dto.newExcavate.NewFormatIndustryRankingDTO">
    SELECT
	      INDUSTRY_NAME industryName,
	      SUM(COUNT_NUM) heatValue
	  FROM INDUSTRIAL_SCREEN.GFACE_INDUSTRY_DAILY_STAT
	  WHERE SRC_TYPE = #{type} AND <!--datediff(WEEK,#{year},DATE-1) = 0--> WEEK(DATE_FORMAT(DATE,'%Y-%m-%d'),1) = WEEK(#{year},1)
	  GROUP BY INDUSTRY_NAME
	  ORDER BY SUM(COUNT_NUM) DESC
  </select>
  <!--查询上周数据-->
  <select id="selectnumber"
          resultType="com.screen.dto.newExcavate.NewFormatIndustryRankingDTO">
    SELECT
	      INDUSTRY_NAME industryName,
	      SUM(COUNT_NUM) heatValue
	  FROM INDUSTRIAL_SCREEN.GFACE_INDUSTRY_DAILY_STAT
	  WHERE SRC_TYPE = #{type} AND <!--datediff(WEEK,#{year},DATE-1) = -1--> WEEK(DATE_FORMAT(DATE,'%Y-%m-%d'),1) = WEEK(#{year},1) - 1
	  GROUP BY INDUSTRY_NAME
	  ORDER BY SUM(COUNT_NUM) DESC
  </select>

本次方法逻辑为:查询当前传入时间为一年的第几周,然后和数据库中时间所在周对比。

获取本月的所有日期:

SELECT 
	DT 
FROM(
	SELECT TRUNC (last_day(now()) - ROWNUM) dt FROM DUAL CONNECT BY ROWNUM < 32
  	)
 where DT >= trunc(sysdate,'mm')

获取近一段时间的日期(包括当天的,如不需要可以把+1去掉,从昨天开始算):
示例显示的为近30天的所有日期

select date_format(trunc(now()+1- ROWNUM),'%Y-%m-%d') a from dual CONNECT BY ROWNUM < 31 order by  a asc

2022-10-25增加
以上获取时间的SQL如果用的连接池不对会报错,但不影响数据。作为程序员看到报错信心是很扎心的所以提供一个用java代码获取一段时间的工具类,直接贴图记录(结果为升序排列)。

public class GetDateUtil {
    /**
     * 获取当前日期之前的一段连续日期
     * @param day
     * @return
     */
    public static List<String> dateList(int day){
        List<String> listDay = new ArrayList<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar instance = Calendar.getInstance();
        for (int i = 0; i < day; i++) {
            instance.setTime(new Date());
            instance.add(Calendar.DAY_OF_MONTH,-i);
            listDay.add(dateFormat.format(instance.getTime()));
        }
        return listDay.stream().sorted(Comparator.comparing(DateUtils::parseDate)).collect(Collectors.toList());
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值