首頁 資料庫 mysql教程 [MySQL]--)查询5天之内过生日的同事中的跨年问题的解决过程_MySQL

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

Jun 01, 2016 pm 01:02 PM
生日 過程

前言:

遇到朋友提问,如下:

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,总结

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

無期迷途採購辦:日曆和生日系列週邊上新! 無期迷途採購辦:日曆和生日系列週邊上新! 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生

戀愛與深空祁煜生日主題活動即將開啟:體驗專屬慶生劇情 戀愛與深空祁煜生日主題活動即將開啟:體驗專屬慶生劇情 Feb 29, 2024 pm 03:00 PM

戀與深空已確定將於3月1日更新開啟祁煜生日主題活動,玩家參與活動體驗專屬慶生劇情,此外還有生日限定思念、日常服裝、深空許願券20等獎勵等著你,接下來跟隨小編一起來看看這次的活動詳情。戀與深空祁煜生日主題活動即將開啟:體驗專屬慶生劇情參與活動,體驗專屬慶生劇情。更有生日限定思念、日常服裝、「深空許願券·限時*20」等繽紛獎勵等你獲取!活動時間:3月1日更新後~3月8日上午4:59獨家擁抱:生日五星級思念限時UP許願活動期間,限定五星思念「祁煜·此生奇遇」許願機率限時大幅度提升。 *活動結束後,本張

重返未來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.三回合頭目就暈了,然後直接用大招和傷害技能胖揍。

鳴潮異想奇境難度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.升級前要提前預留足夠的時間,備份重要的東西以免失去。

PHP如何將生日轉換成時間戳記? PHP如何將生日轉換成時間戳記? Mar 04, 2024 pm 06:33 PM

PHP是一種流行的伺服器端腳本語言,常用於網站開發和動態網頁產生。在開發網站時,經常涉及處理用戶生日訊息,有時需要將用戶提供的生日轉換為時間戳進行儲存或計算。以下將介紹如何使用PHP將生日轉換為時間戳,並提供具體的程式碼範例。首先,我們需要了解生日的儲存格式。一般來說,生日的格式是"年-月-日",如"1990-05-20"。我們將根據這種格式的生日數據,

See all articles