当前位置 博文首页 > iloki的博客:JAVA+SQL 获取最近几天要过生日的人

    iloki的博客:JAVA+SQL 获取最近几天要过生日的人

    作者:[db:作者] 时间:2021-08-25 12:43

    一、SQL查询(未处理跨年问题)

    --oralce
    select a.birthday,
      from TABLE_USER a
     where to_char(a.birthday, 'MMdd') >= to_char(date '2021-06-01', 'MMdd')
       and to_char(a.birthday, 'MMdd') <= to_char(sysdate + 5, 'MMdd')
    --gbase
    select a.birthday,
      from TABLE_USER a
    where to_char(a.birthday, 'MMdd') >= to_char(sysdate, 'MMdd')
          and to_char(a.birthday, 'MMdd') <= to_char(sysdate+ interval(5) day to day, 'MMdd')
    

    二、代码比较生日范围

    	private  static final ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal= ThreadLocal.withInitial(() -> new SimpleDateFormat("MMdd"));
    	/**
         * 比较日期是否在区间内(月日)
         * @param date 日期
         * @param dateBefore 开始日期
         * @param dateAfter 结束日期
         * @return
         */
        private boolean isInDateRange(Date date, Date dateBefore, Date dateAfter) {
            if(date == null) return false;
            String dateFirst = simpleDateFormatThreadLocal.get().format(dateBefore);
            String dateLast = simpleDateFormatThreadLocal.get().format(dateAfter);
            String dateString = simpleDateFormatThreadLocal.get().format(date);
            int dateFirstIntVal = Integer.parseInt(dateFirst);
            int dateLastIntVal = Integer.parseInt(dateLast);
            int dateStringIntVal = Integer.parseInt(dateString);
            if (dateStringIntVal >= dateFirstIntVal && dateStringIntVal <= dateLastIntVal) {
                return true;
            }
            //日期跨年比较
            if (dateFirstIntVal > dateLastIntVal) {
                //跨年,开始时期和比较时期在同一年 开始:2021-12-01  比较:2021-12-05 结束:2022-01-02
                if (dateStringIntVal >= dateFirstIntVal) {
                    return true;
                }
                if (dateStringIntVal <= dateLastIntVal) {
                    //跨年,结束时期和比较时期在同一年 开始:2021-12-01  比较:2022-01-01 结束:2022-01-02
                    return true;
                }
            }
            return false;
        }
    
    	/**
         * 比较生日是否在区间内(年月日)
         *
         * @param date       日期
         * @param dateBefore 开始日期
         * @param dateAfter  结束日期
         * @return
         */
        private boolean isInBirthdayRange(Date date, Date dateBefore, Date dateAfter) {
            if (date == null) return false;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String dateFirst = sdf.format(dateBefore);
            String dateLast = sdf.format(dateAfter);
            String dateString = sdf.format(new Date()).substring(0,4) + simpleDateFormatThreadLocal.get().format(date);
            int dateFirstIntVal = Integer.parseInt(dateFirst);
            int dateLastIntVal = Integer.parseInt(dateLast);
            int dateStringIntVal = Integer.parseInt(dateString);
            if (dateStringIntVal >= dateFirstIntVal && dateStringIntVal <= dateLastIntVal) {
                return true;
            }
            return false;
        }
    

    三、跨年问题解决思路

    将生日日期拼接成:当前年yyyy+生日月日MMdd,然后把这个日期和开始日期、结束日期比较

    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            SimpleDateFormat sdf1 = new SimpleDateFormat("MMdd");
            Date date = sdf.parse("19951205");
            System.out.println("获取生日的月日:"+sdf1.format(date));
            String dateString = sdf.format(new Date()).substring(0,4) + sdf1.format(date);
            System.out.println("拼接当前年+出生月日:"+dateString);
    

    输出:

    获取生日的月日:1205
    拼接当前年+出生月日:20211205
    

    sql:

    select to_char(sysdate,'yyyy')||to_char(date '1995-06-01', 'MMdd') as birthday from dual;
    

    在这里插入图片描述

    cs