MySQL查询:EHR中某时间范围过生日的员工

今天描述一个小问题,描述一下我的思路。

需求背景

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映射文件的错误,我似乎也不会选择这个方法,其中里面的方法太多,假如人数很多的话,铁定会影响效率。

我推荐第一种,简单,有效。

原文发布于微信公众号 - 数据库SQL(SQLdba)

原文发表时间:2018-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券