首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL查询:EHR中某时间范围过生日的员工

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

作者头像
赵腰静
发布2018-12-29 17:36:17
3.1K0
发布2018-12-29 17:36:17
举报
文章被收录于专栏:程序猿程序猿程序猿

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

需求背景

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档