业务需求
推荐用户时需要筛选出一定年龄的才可以展示(有的人出生年月日选择的当前年月日,需要规避掉这个人的展示)
业务实现的sql用法
SELECT * FROM `user` WHERE TIMESTAMPDIFF(MONTH,birth,DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')) > 216
2021年2月29日更新:
业务需要自定义sql时,如果数据量较大时,尽量避免在索引列上使用mysql的内置函数(假设birth加了索引)内置函数会导致索引失效,不要使用 select * ,尽量只拿需要的字段。
SELECT id,`name`,nick_name FROM `user` WHERE birth < Date_ADD(NOW(),INTERVAL -216 MONTH)
sql解析
TIMESTAMPDIFF(类型,开始时间,结束时间)
TIMESTAMPDIFF的类型包含以下几种:
- YEAR 年
- MONTH 月
- DAY 日
- HOUR 时
- MINUTE 分
- SECOND 秒
- MICROSECOND 微秒
- WEEK 周
以下sql中的birth是出生日期,也可以用’2021-02-23 00:00:00 00:00:00’
相差的年数
SELECT TIMESTAMPDIFF(YEAR,birth,DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S'))
如果是当前年份比较返回的则是0,该语法只会对年份进行判断,粒度比较粗(比如19年12月与20年1月计算结果也是1年)
相差的月数
SELECT TIMESTAMPDIFF(MONTH,2021-02-23 00:00:00 00:00:00,DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S'))
如果是当前月比较返回的则是0
相差的天数
SELECT TIMESTAMPDIFF(DAY,'2021-02-28 00:00:00',DATE_FORMAT('2021-03-1 00:00:00', '%Y-%m-%d %H:%i:%S'))
2月份只有28天计算天数时会自动判断3月日期相隔天数(这里面竟然没有坑!!!,如果有坑,麻烦告知一下我。谢谢大佬。)