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

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

Jun 01, 2016 pm 01:02 PM
過程 閏年

前言:
上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,其中漏了一个闰年2月29日生日的细节问题,现在补充一下这个问题的处理过程:
5,补充闰年判断
有朋友提醒,闰年2月29日生日的话,可能查询不到,想到确实没有考虑到这个特殊的日期。
5.1,准备测试数据SQL,包含1980-02-29这一天生日的朋友。
INSERT INTO ali_users SELECT 'Jeff','1980-02-29','13998786549'
5.2,录入测试数据
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> INSERT INTO ali_users SELECT \'Jeff\',\'1980-02-29\',\'13998786549\' UNION ALL SELECT \'XiaoTeng\',\'1980-03-01\',\'13998786549\'
-> UNION ALL SELECT \'HeSheng\',\'1980-03-02\',\'13998786549\'
-> UNION ALL SELECT \'JingPan\',\'1980-03-03\',\'13998786549\'
-> UNION ALL SELECT \'WuHong\',\'1986-03-04\',\'13998786549\';
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql>
5.3,执行原来的旧版本的SQL查询检查结果
mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(\'2014-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2014-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(\'2014-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2014-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> ;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| XiaoTeng | 1980-03-01 | 13998786549 |
| HeSheng | 1980-03-02 | 13998786549 |
| JingPan | 1980-03-03 | 13998786549 |
| WuHong | 1986-03-04 | 13998786549 |
+----------+------------+-------------+
4 rows in set, 2 warnings (0.00 sec)


mysql>
5.4,先建立一个存储函数f_isleap_year判断当年年份是否是闰年
DELIMITER $$
USE `test`$$
DROP FUNCTION IF EXISTS `f_not_leap_year`$$
CREATE FUNCTION `f_not_leap_year`(p_year BIGINT) RETURNS BOOLEAN
BEGIN
/*是闰年则返回0(false),不是闰年则返回1(true)*/
DECLARE v_flag INT DEFAULT 0;
/*①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)*/
IF (p_year%4)=0 AND (p_year%100)>0 THEN
SET v_flag=0;
/*②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年) */
ELSEIF (p_year%400)=0 THEN
SET v_flag=0;
/*③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,
86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48\'45.5\'\'计算)。
*/
ELSEIF (p_year%3200)=0 AND (p_year%172800)=0 THEN
SET v_flag=0;
ELSE
SET v_flag=1;
END IF;
RETURN v_flag;
END$$
DELIMITER ;
存储函数执行如下图所示:
\5.4.2 准备SQL语句
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
OR /*补充闰年2月29日的生日问题*/
(
f_not_leap_year(YEAR(NOW()))
AND DATE_FORMAT(birthday,\'-%m-%d\')=\'-02-29\'
AND DATEDIFF(CAST(CONCAT(\'2000\',DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(CONCAT(\'2000\',DATE_FORMAT(NOW(),\'-%m-%d\')) AS DATE))
BETWEEN 0 AND 4
);
5.4.3 在非闰年的时候,验证闰年2月29日生日,选择2014年非闰年测试
SELECT * FROM ali_users WHERE
执行SQL检验成果,如果当天是2014-02-28,看到已经有2月29日的生日的同事被记录进来了,其实包含了2月28日、2月29日、3月1日、3月2日、3月3日、3月4日的生日的同事。
PS:因为2月29日在当年不存在,所以不算这5天之内的范畴,执行结果如下所示:
mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(\'2014-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2014-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(\'2014-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2014-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR /*补充闰年2月29日的生日方法*/
-> (
-> f_not_leap_year(YEAR(\'2014-02-28 00:10:10\'))
-> AND DATE_FORMAT(birthday,\'-%m-%d\')=\'-02-29\'
-> AND DATEDIFF(CAST(CONCAT(\'2000\',DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(CONCAT(\'2000\',DATE_FORMAT(\'2000-02-28 00:10:10\',\'-%m-%d\')) AS DATE))
-> BETWEEN 0 AND 4
-> );
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| Jeff | 1980-02-29 | 13998786549 |
| XiaoTeng | 1980-03-01 | 13998786549 |
| HeSheng | 1980-03-02 | 13998786549 |
| JingPan | 1980-03-03 | 13998786549 |
| WuHong | 1986-03-04 | 13998786549 |
| WeiYa | 1980-02-28 | 13998786549 |
+----------+------------+-------------+
6 rows in set, 2 warnings (0.00 sec)


mysql>
5.4.4 在闰年的时候,验证闰年2月29日生日,选择2004年闰年测试
把Step#2中的SQL的NOW()改成'2004-02-28 00:10:10'来进行测试,SQL如下所示:

SELECT * FROM ali_users WHERE
DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
OR/* or后面的是捎带解决跨年问题*/
DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
OR /*补充闰年2月29日的生日方法*/
(
f_not_leap_year(YEAR(\'2004-02-28 00:10:10\'))
AND DATE_FORMAT(birthday,\'-%m-%d\')=\'-02-29\'
AND DATEDIFF(CAST(CONCAT(\'2000\',DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(CONCAT(\'2000\',DATE_FORMAT(\'2004-02-28 00:10:10\',\'-%m-%d\')) ASDATE))
BETWEEN 0 AND 4
);

mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR /*补充闰年2月29日的生日方法*/
-> (
-> f_not_leap_year(YEAR(\'2004-02-28 00:10:10\'))
-> AND DATE_FORMAT(birthday,\'-%m-%d\')=\'-02-29\'
-> AND DATEDIFF(CAST(CONCAT(\'2000\',DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(CONCAT(\'2000\',DATE_FORMAT(\'2004-02-28 00:10:10\',\'-%m-%d\')) AS DATE))
-> BETWEEN 0 AND 4
-> );
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| Jeff | 1980-02-29 | 13998786549 |
| XiaoTeng | 1980-03-01 | 13998786549 |
| HeSheng | 1980-03-02 | 13998786549 |
| JingPan | 1980-03-03 | 13998786549 |
| WeiYa | 1980-02-28 | 13998786549 |
+----------+------------+-------------+
5 rows in set (0.00 sec)


mysql>
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
php怎麼判斷閏年?三種方法介紹 php怎麼判斷閏年?三種方法介紹 Mar 28, 2023 pm 03:45 PM

閏年是指公曆中四年一閏,即在普通的365天的年份之間插入366天的一年,其目的是為了與太陽年相符合。依照格里高利曆的規定,閏年一般有兩種情況:①年份能被4整除,但是不能被100整除;②年份能被400整除。在這篇文章中,我們將為大家介紹基於PHP程式語言實作閏年判斷的方法。

在C語言中編寫一個程序,用於檢查給定的年份是否為閏年 在C語言中編寫一個程序,用於檢查給定的年份是否為閏年 Sep 20, 2023 pm 03:33 PM

閏年有366天,而普通年有365天,任務是透過程序檢查給定的年份是否為閏年。判斷的邏輯可以透過檢查年份是否能被400或4整除來實現,但如果不能被這兩個數整除,則為普通年。範例Input-:year=2000Output-:2000isaLeapYearInput-:year=101Output-:101isnotaLeapyear演算法StartStep1->declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye;declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye

重返未來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怎麼過鳴鐘之龜角色強化共鳴技能可以提升我們氣動的效果了,這樣一來打出的攻擊效率也會提升到,傷害也會更加的大的,不過大家要是有效果替換也是可以換取的。 〔隱喻〕前三關選擇:林中驕陽:可以讓忌炎的傷害提升很多,技能的使用次數變多的話那麼可以打出非常不錯的暴擊效果了。防護裝置:用共鳴技

解釋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.升級前要提前預留足夠的時間,備份重要的東西以免失去。

龍之信條2小小的冒險怎麼過 龍之信條2小小的冒險怎麼過 Mar 26, 2024 am 08:10 AM

小小的冒險作為龍之信條中的一個前期的支線,那麼這個任務要怎麼樣才能夠完成呢?玩家首先需要前往梅維,在這裡的雜貨店接受這個任務,購買藥丸就可以完成這個支線,總的來說還是很簡單的,詳細的內容可以在這篇小小的冒險任務圖文攻略之中進行了解,一起來看看吧。龍之信條2小小的冒險怎麼過1、先透過搭乘維綸沃茲北部的牛車前往梅維。 2.到達梅維之後,前往倫奈的道具帶你,在這裡和NPC進行對話開啟任務。 3.隨後玩家進入到門後的商店,在這裡和大叔進行對話,購買藥丸。 4.購買之後,回到門口,將藥丸提供給NPC。 5、隨後

如何有效完成笑傲江湖手遊冥想試煉? 如何有效完成笑傲江湖手遊冥想試煉? Jan 30, 2024 pm 06:48 PM

小夥伴們,小編今天帶給大家的是新笑傲江湖手遊冥想試煉的詳細攻略分享。接下來,我們一起來看看小編整理的冥想試煉打法的內容。如果你對此有興趣,就快去遊戲裡試試看。新笑傲江湖手遊冥想試煉怎麼過冥想試煉:冥想試煉還是比較吃操作的,這裡教幾個小技巧。 1)聚怪,盡量讓前幾波小怪在最後一波時候都盡量在殘血狀態。 2)第一次加攻擊狀態用在在第二波怪刷新,配合自己的技能爆發,快速壓低*波和第二波小怪的血量。 3)第二次加攻擊狀態用在最後10S最後一波怪刷新,配合絕學的一波傷害瞬間清屏,剩下的幾隻小怪用技能

See all articles