search
HomeDatabaseMysql Tutorial[MySQL]--)查询5天之内过生日的同事中的跨年问题的解决过程_MySQL

前言:

遇到朋友提问,如下:

SELECT * FROM ali_users WHERE DATEDIFF(CAST(CONCAT(DATE_FORMAT(NOW(),'%y'),DATE_FORMAT(birthday,'-%m-%d'))AS DATE),CAST(DATE_FORMAT(NOW(),'%y-%m-%d') AS DATE))
1,准备测试数据,需要包含跨年的数据

1.1,准备测试数据的SQL

USE test;
DROP TABLE IF EXISTS ali_users;
CREATE TABLE ali_users (username VARCHAR(10),birthday DATE NOT NULL,iphone VARCHAR(16));
INSERT INTO ali_users SELECT \'MaoYi\',\'1985-09-04\',\'13998786543\' UNION ALL
SELECT \'LiuEr\',\'1985-08-30\',\'13998786543\' UNION ALL
SELECT \'ZhangSan\',\'1981-01-01\',\'13998786543\' UNION ALL
SELECT \'LiSi\',\'1983-01-02\',\'13998786543\' UNION ALL
SELECT \'WangWu\',\'1984-11-01\',\'13998786543\' UNION ALL
SELECT \'ZhaoLiu\',\'1984-11-01\',\'13998786543\' UNION ALL
SELECT \'SongQi\',\'1986-08-31\',\'13998786543\' UNION ALL
SELECT \'HuangBa\',\'1989-09-01\',\'13998786543\' UNION ALL
SELECT \'ZengJiu\',\'1989-09-02\',\'13998786543\' UNION ALL
SELECT \'LuoShi\',\'1985-09-03\',\'13998786543\' UNION ALL
SELECT \'Tom\',\'1995-09-05\',\'13998786543\' UNION ALL
SELECT \'Licy\',\'1991-12-30\',\'13998286543\' UNION ALL
SELECT \'Cari\',\'1992-12-31\',\'13998286543\' UNION ALL
SELECT \'Mark\',\'1992-01-03\',\'13998286543\' UNION ALL
SELECT \'Ruby\',\'1992-01-04\',\'13998286547\';
1.2,在数据库命令行执行SQL

mysql> USE test;
DATABASE CHANGED
mysql> DROP TABLE IF EXISTS ali_users;
QUERY OK, 0 ROWS affected (0.00 sec)

mysql> CREATE TABLE ali_users (username VARCHAR(10),birthday DATE NOT NULL,iphone VARCHAR(16));
QUERY OK, 0 ROWS affected (0.01 sec)

mysql> INSERT INTO ali_users SELECT \'MaoYi\',\'1985-09-04\',\'13998786543\' UNION ALL
-> SELECT \'LiuEr\',\'1985-08-30\',\'13998786543\' UNION ALL
-> SELECT \'ZhangSan\',\'1981-01-01\',\'13998786543\' UNION ALL
-> SELECT \'LiSi\',\'1983-01-02\',\'13998786543\' UNION ALL
-> SELECT \'WangWu\',\'1984-11-01\',\'13998786543\' UNION ALL
-> SELECT \'ZhaoLiu\',\'1984-11-01\',\'13998786543\' UNION ALL
-> SELECT \'SongQi\',\'1986-08-31\',\'13998786543\' UNION ALL
-> SELECT \'HuangBa\',\'1989-09-01\',\'13998786543\' UNION ALL
-> SELECT \'ZengJiu\',\'1989-09-02\',\'13998786543\' UNION ALL
-> SELECT \'LuoShi\',\'1985-09-03\',\'13998786543\' UNION ALL
-> SELECT \'Tom\',\'1995-09-05\',\'13998786543\' UNION ALL
-> SELECT \'Licy\',\'1991-12-30\',\'13998286543\' UNION ALL
-> SELECT \'Cari\',\'1992-12-31\',\'13998286543\' UNION ALL
-> SELECT \'Mark\',\'1992-01-03\',\'13998286543\' UNION ALL
-> SELECT \'Ruby\',\'1992-01-04\',\'13998286547\';
QUERY OK, 15 ROWS affected (0.01 sec)
Records: 15 Duplicates: 0 WARNINGS: 0

mysql> SELECT * FROM ali_users;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| MaoYi | 1985-09-04 | 13998786543 |
| LiuEr | 1985-08-30 | 13998786543 |
| ZhangSan | 1981-01-01 | 13998786543 |
| LiSi | 1983-01-02 | 13998786543 |
| WangWu | 1984-11-01 | 13998786543 |
| ZhaoLiu | 1984-11-01 | 13998786543 |
| SongQi | 1986-08-31 | 13998786543 |
| HuangBa | 1989-09-01 | 13998786543 |
| ZengJiu | 1989-09-02 | 13998786543 |
| LuoShi | 1985-09-03 | 13998786543 |
| Tom | 1995-09-05 | 13998786543 |
| Licy | 1991-12-30 | 13998286543 |
| Cari | 1992-12-31 | 13998286543 |
| Mark | 1992-01-03 | 13998286543 |
| Ruby | 1992-01-04 | 13998286547 |
+----------+------------+-------------+
15 ROWS IN SET (0.00 sec)

mysql>
2,写出查询SQL
SELECT * FROM ali_users WHERE
2,1,跨年问题分析
因为跨年的时候生日字段通常月份比较小是1月,所以如果利用DATEDIFF来判断要与月份比较大12月来比较得到相差天数在N天之内的话,就需要YEAR(NOW())+1,当年年份+1再加上月份才能与NOW()比较得出真实的相差天数。
2.2,5天之内的设定
N天之内,用 BETWEEN 0 AND N 来判断,如果是5天之内(包含今天)那么N值就是4,就是 BETWEEN 0 AND 4
3,验证数据
比如提醒最近5天之内(包括今日)过生日的同事,生日快乐。
3.1,查询的数据都在今年之内的,比如今天是8月30日,那么需要执行的SQL如下:
SELECT * FROM ali_users WHERE
查询的结果应该是从今天8月30日到9月3日之间过生日的同事,包括LiuEr,SongQi,HuangBa,ZengJiu,LuoShi;

mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> ;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| LiuEr | 1985-08-30 | 13998786543 |
| SongQi | 1986-08-31 | 13998786543 |
| HuangBa | 1989-09-01 | 13998786543 |
| ZengJiu | 1989-09-02 | 13998786543 |
| LuoShi | 1985-09-03 | 13998786543 |
+----------+------------+-------------+
5 ROWS IN SET (0.00 sec)

mysql>
3.2,查询的生日有跨年的
比如今天是2013年12月30日,要查询5天之内过生日的同事,那么就有2013年的12月30日31日过生日的,也有2014年1月1日2日3日过生日的同事,因为今天是8月30日,所以要把Step#2中的SQL的NOW()改成'2013-12-30 00:10:10'来进行测试,SQL整理如下:
mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(\'2013-12-30 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2013-12-30 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(\'2013-12-30 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2013-12-30 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> ;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| ZhangSan | 1981-01-01 | 13998786543 |
| LiSi | 1983-01-02 | 13998786543 |
| Licy | 1991-12-30 | 13998286543 |
| Cari | 1992-12-31 | 13998286543 |
| Mark | 1992-01-03 | 13998286543 |
+----------+------------+-------------+
5 ROWS IN SET (0.00 sec)

mysql>
4,总结

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
恋与深空祁煜生日主题活动即将开启:体验专属庆生剧情恋与深空祁煜生日主题活动即将开启:体验专属庆生剧情Feb 29, 2024 pm 03:00 PM

恋与深空已经确定将于3月1日更新开启祁煜生日主题活动,玩家参与活动体验专属庆生剧情,此外还有生日限定思念、日常服装、深空许愿券20等奖励等待着你,接下来跟随小编一起来看看本次的活动详情。恋与深空祁煜生日主题活动即将开启:体验专属庆生剧情参与活动,体验专属庆生剧情。更有生日限定思念、日常服装、「深空许愿券·限时*20」等缤纷奖励等你获取!活动时间:3月1日更新后~3月8日上午4:59独家拥抱:生日五星思念限时UP许愿活动期间,限定五星思念「祁煜·此生奇遇」许愿概率限时大幅度提升。*活动结束后,本张

无期迷途采购办:日历和生日系列周边上新!无期迷途采购办:日历和生日系列周边上新!Feb 29, 2024 pm 12:00 PM

无期迷途采购办确定将于2月28日上午11点更新,玩家可以前往淘宝搜索无期迷途采购办选择店铺分类进行购买,本次为大家带来的是MBCC生日会系列及2024台历周边,一起来看看本次的商品详情。无期迷途采购办:日历和生日系列周边上新!无期迷途采购办上新!—预售时间:2024年2月28日11:00——2024年3月13日23:59采购地址:淘宝搜索【无期迷途采购办】选择【店铺】分类即可进店采购;周边介绍:本次周边上新为MBCC生日会系列及2024台历周边,请点击长图查阅详情。采购办上新周边介绍—MBCC生

重返未来19996-24怎么过重返未来19996-24怎么过Mar 02, 2024 pm 12:58 PM

重返未来1999中玩家会在其中面对很多的关卡挑战,而且其中一个个不同的关卡所带来的挑战都完全不一样,而6-24作为其中一个关卡,也肯定会有着不少玩家想知道这一关卡该如何去进行挑战吧,所以下面也是会带来相关的通关方法了。重返未来19996-24通关方法1、一句话挂30层燃烧后,等boss眩晕一顿胖揍。2、一回合优先用主C和142d挂燃烧。3、二回合用辅助和奶妈小技能挂燃烧+和主c卡攒个大招。4、三回合boss就眩晕了,然后直接用大招和伤害技能胖揍。

鸣潮异想奇境难度3怎么过鸣潮异想奇境难度3怎么过Feb 28, 2024 pm 10:19 PM

鸣潮异想奇境难度3怎么过通关方式分享。鸣潮里面很多人都在通关这个异想奇境难度3了呢,这一关其实还是有点难度的,很多小伙伴们还不知道该怎么办比较好,不过不用担心,小编为大家带来了其中的攻略,你也来试试看吧。鸣潮异想奇境难度3怎么过鸣钟之龟角色强化共鸣技能可以提升我们气动的效果了,这样一来打出的攻击效率也会提升到,伤害也会更加的大的,不过大家要是有效果替换也是可以换取的。〔隐喻〕前三关选择:林中骄阳:可以让忌炎的伤害提升很多,技能的使用次数变多的话那么可以打出非常不错的暴击效果了。防护装置:用共鸣技

PHP生日转时间戳的实现方法分享PHP生日转时间戳的实现方法分享Mar 04, 2024 pm 05:54 PM

PHP生日转时间戳的实现方法分享在日常开发中,有时候我们需要将用户的生日转换为时间戳的形式,以便进行更多的操作,比如计算年龄、比较时间等。本文将分享如何使用PHP将生日转换为时间戳的方法,并提供具体的代码示例。PHP提供了丰富的日期和时间处理函数,我们可以利用这些函数来完成生日转时间戳的操作。首先,我们需要获取用户输入的生日日期,一般可以通过表单获取,然后使

解释C语言中选择排序的过程解释C语言中选择排序的过程Sep 01, 2023 pm 01:57 PM

选择排序是一种攻击性算法,用于从数组中找到最小的数字,然后将其放置到第一个位置。下一个要遍历的数组将从索引开始,靠近放置最小数字的位置。选择排序的过程选择元素列表中第一个最小的元素并将其放置在第一个位置。对列表中的其余元素重复相同的操作,直到所有元素都获得已排序。考虑以下列表-第一次通过Sm=a[0]=30Sma[1]

win10升级所需时间详细解析win10升级所需时间详细解析Jan 10, 2024 am 12:00 AM

很多的小伙伴都想将自己的电脑系统升级为win10系统,但是不清楚升级过程需要多久,今天就给你们带来了更新到win10需要时间详细介绍,快来一起看看吧。更新到win10要多久:1、根据每个用户机器性能的不同大约40分钟~2/3小时左右不等。2、配置性能的不同时间也不同,与旧系统数据的多少也有密切关系。3、如果电脑的东西很多加上是机械键盘的话会更加的慢速。4、如果是从win7/8升级win10的话差不多在一个半小时左右。5、在升级前要提前预留足够的时间,备份重要的东西以免丢失。

Golang编译过程详解Golang编译过程详解Mar 07, 2024 am 09:24 AM

Golang编译过程详解Golang(也称为Go)是一种由Google开发的编程语言,它具有简洁、高效、并发等特点,因此受到了广泛的关注和应用。在使用Golang进行编程时,编译是一个非常重要的环节,本文将详细介绍Golang的编译过程,并提供具体的代码示例。一、Golang源代码的编译过程词法分析(LexicalAnalysis)在编译过程中的第一步是词

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)