JAVA+SQL 获取最近几天要过生日的人

一、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;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值