需求背景
1、要求在用户在查询界面,可以查询自定义范围期限的员工生日。
2、页面渲染的时候,默认出现近七天内要过生日的人。并发邮件提醒(发邮件提醒不在这里完成,是在其他模块,这里只描述如何查询生日的人)。
如下图案例(组件使用Element-UI):
一个是起始时间,一个是终止时间。
需求分析
生日的查询好实现,员工表中,其中有员工表的生日提醒。
这里需要注意的几个点:
1、查询生日的时候,需拆分一下时间,需要把年份去掉,只留下月日。
2、跨年查询。
第2点要是搁在普通的时间,用到的很少,现在是跨年,硬性需求。而且,生日查询嘛,一般查询的都是近期的,没有查询跨度半年或者是好几个月的,这样不太符合一般性的需求。
具体实现
跨年查询我有两种方法,我再Mybatis中,用的是第一种。
方法一:前端往后端传时间的时候,时间取值转换成字符串,只截取月日四个数字,比如'1225',然后传给后端。后端拿到,在MySQL语句处理的时候,我拿到员工的生日,一样截取月日。
这样就能匹配起来。单纯这样子,还无法对跨年进行处理。
方法二:取出员工的生日,比较与现在输入查询的年份【用户输入的不一定是今年哦~所以,不能取现在的时间】的[差距多少年],也就是算了算他多少岁,然后把他生日的年份加上+[[差距多少年]],就是所选查询日期的起始年份。
例如,经过方法二的查询,本来张三的生日是1990-12-25,查询的时候,加入输入的起始时间是:【2018-09-08】,他的生日会变成【2018-12-25】。
同样,查询第二个时间点,终止时间,也这样去写,可以解决跨年的问题。
那么方法一中的跨年问题如何去解决呢?我没有去判断时间点,是不是终止的时间日期要比起始日期要小之类的。
MySQL语句
这是在navicat中执行的语句,使用union all链接结果。这个其实看出的不明显,第二张图我放上MyBatis映射文件中的代码。
在查询起始时间大于终止时间的时候,第一个select,查询的结果集是空,这里跨年处理我是将时间节点截断的。
BETWEEN #{data.startDataBirthdayPoint} AND '1231'
BETWEEN '0101' AND #{data.endDataBirthdayPoint}
用这两个来处理跨年。不管用户选择是哪一年,都好使。
下面是第二种方法的代码:
这个方式,单纯的查询,能够实现我想要的需求,我放到MyBatis映射文件去查询的时候,报错,具体的原因我没有去细查。
如果我解决了MyBatis映射文件的错误,我似乎也不会选择这个方法,其中里面的方法太多,假如人数很多的话,铁定会影响效率。
我推荐第一种,简单,有效。