[MySQL]--)查询5天之内过生日的同事中的闰年2月29日问题的解决过程_MySQL
上次写了查询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 ;
存储函数执行如下图所示:

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>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











윤년이란 그레고리력으로 4년마다 윤년을 말하며, 즉 보통 365일의 1년 사이에 366일의 1년을 삽입한 해를 태양년에 맞추는 것을 목적으로 한다. 그레고리력의 규정에 따르면 윤년에는 일반적으로 두 가지 상황이 있습니다. 즉, 연도가 4로 균등하게 나누어지지만 100으로 나누어지지 않는 해, ② 400으로 균등하게 나누어지는 연도입니다. 이번 글에서는 PHP 프로그래밍 언어를 기반으로 윤년 판정을 구현하는 방법을 소개하겠습니다.

윤년은 366일, 평년은 365일을 갖는 해가 윤년인지를 프로그램을 통해 확인하는 작업이다. 판단의 논리는 해당 연도가 400으로 나누어지는지, 4로 나누어지는지 여부를 확인하여 구현할 수 있지만, 이 두 숫자로 나누어지지 않으면 평년이 됩니다. 예Input-:year=2000Output-:2000isaLeapYearInput-:year=101Output-:101isnotaLeapyear 알고리즘StartStep1->declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye

Back to the Future 1999에서 플레이어는 다양한 레벨의 도전에 직면하게 되며 각 레벨은 완전히 다른 도전을 가져옵니다. 레벨 중 하나인 6-24에서는 확실히 많은 플레이어가 이 레벨에 도전하는 방법을 알고 있을 것입니다. 다음은 관련 정리 방법도 가져올 것입니다. 백투더퓨처 19996-24 클리어 방법 1. 한 문장으로 레벨 30을 불태운 뒤, 보스가 기절할 때까지 기다렸다가 세게 때린다. 2. 한 라운드에 굽기 위해 메인 C와 142d를 우선적으로 사용합니다. 3. 두 번째 라운드에서는 보조와 유모의 작은 스킬을 사용하여 화상을 입히고 메인 C 카드를 사용하여 큰 움직임을 만듭니다. 4. 보스는 3라운드에 기절한 후 궁극기 이동 및 데미지 스킬로 직접 제압됩니다.

Ming Tide Fantasyland 난이도 3 레벨을 통과하는 방법을 공유하세요. Mingchao의 많은 사람들이 이 판타지 랜드의 레벨 3을 완료하고 있습니다. 이 레벨은 실제로 약간 어렵습니다. 많은 친구들이 아직 무엇을 해야할지 모르지만, 읽어보셨다면 편집자가 알려드릴 것입니다. 거기에 담긴 전략을 직접 체험해 보세요. 울리는 조류 판타지 난이도 3을 통과하는 방법은 무엇입니까? 벨 터틀 캐릭터의 공명 스킬을 강화하면 공력 효과가 향상될 수 있습니다. 그러나 모두가 가지고 있으면 공격 효율이 높아집니다. 효과 교환도 가능합니다. [은유] 처음 3개 레벨 중 하나를 선택하세요. Sun in the Forest: 스킬을 여러 번 사용하면 매우 좋은 치명타 효과를 낼 수 있습니다. 보호 장치: 공진 기술 사용

선택 정렬은 배열에서 가장 작은 숫자를 찾아 첫 번째 위치에 배치하는 데 사용되는 공격적인 알고리즘입니다. 탐색할 다음 배열은 가장 작은 숫자가 배치된 위치에 가까운 인덱스에서 시작됩니다. 선택 정렬 프로세스는 요소 목록에서 첫 번째로 작은 요소를 선택하여 첫 번째 위치에 배치합니다. 모든 요소가 정렬될 때까지 목록의 나머지 요소에 대해 동일한 작업을 반복합니다. 다음 목록을 고려하세요. 먼저 Sm=a[0]=30Sma[1]을 통과하세요.

많은 친구들이 자신의 컴퓨터 시스템을 win10 시스템으로 업그레이드하고 싶어하지만 업그레이드 과정이 얼마나 걸릴지 모릅니다. 오늘은 win10으로 업데이트하는 데 필요한 시간에 대해 자세히 소개했습니다. win10으로 업데이트하는 데 시간이 얼마나 걸립니까? 1. 각 사용자 컴퓨터의 성능에 따라 약 40분에서 2/3시간 정도 걸립니다. 2. 성능을 구성하는 시간도 다르며 이는 기존 시스템의 데이터 양과 밀접한 관련이 있습니다. 3. 컴퓨터에 물건이 많고 기계식 키보드가 있으면 속도가 더욱 느려집니다. 4. win7/8에서 win10으로 업그레이드하는 경우 약 1시간 30분 정도 소요됩니다. 5. 손실을 피하기 위해 중요한 사항을 백업하려면 업그레이드하기 전에 미리 충분한 시간을 확보하십시오.

작은 모험은 Dragon's Dogma의 초기 분기인데, 이 작업을 어떻게 완료할 수 있나요? 플레이어는 먼저 Mevi로 가서 여기 식료품점에서 이 임무를 수락하고 약을 구입하여 이 분기를 완료해야 합니다. 일반적으로 자세한 내용은 이 작은 모험 임무 그래픽 가이드에서 찾을 수 있습니다. 그리고 함께 살펴보세요. Dragon's Dogma 2: 1의 작은 모험에서 살아남는 방법. 먼저 Velenworth 북쪽의 소 수레를 타고 Meve로 가세요. 2. 메비 도착 후 루나이의 소품으로 이동한 후 이곳에 있는 NPC와 대화하여 미션을 시작하세요. 3. 그러면 플레이어는 문 뒤에 있는 가게에 들어가서 여기 있는 삼촌과 대화를 나누고 약을 삽니다. 4. 구매 후 문으로 돌아와서 NPC에게 알약을 건네주세요. 5. 이후

Golang 컴파일 프로세스에 대한 자세한 설명 Golang(Go라고도 함)은 Google에서 개발한 프로그래밍 언어로 단순성, 효율성, 동시성 등의 특성을 갖고 있어 폭넓은 관심과 응용을 받아왔습니다. Golang으로 프로그래밍할 때 컴파일은 매우 중요한 링크입니다. 이 기사에서는 Golang 컴파일 프로세스를 자세히 소개하고 구체적인 코드 예제를 제공합니다. 1. Golang 소스 코드의 컴파일 과정 어휘 분석(LexicalAnalytic) 컴파일 과정의 첫 번째 단계는 단어입니다.
