데이터 베이스 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 기반 앱

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

PHP에서 윤년을 결정하는 방법은 무엇입니까? 세 가지 방법 소개 PHP에서 윤년을 결정하는 방법은 무엇입니까? 세 가지 방법 소개 Mar 28, 2023 pm 03:45 PM

윤년이란 그레고리력으로 4년마다 윤년을 말하며, 즉 보통 365일의 1년 사이에 366일의 1년을 삽입한 해를 태양년에 맞추는 것을 목적으로 한다. 그레고리력의 규정에 따르면 윤년에는 일반적으로 두 가지 상황이 있습니다. 즉, 연도가 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

Back to the Future 19996-24를 보내는 방법 Back to the Future 19996-24를 보내는 방법 Mar 02, 2024 pm 12:58 PM

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

Mingtide Fantasyland의 난이도 3을 극복하는 방법 Mingtide Fantasyland의 난이도 3을 극복하는 방법 Feb 28, 2024 pm 10:19 PM

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

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으로 업그레이드하는 경우 약 1시간 30분 정도 소요됩니다. 5. 손실을 피하기 위해 중요한 사항을 백업하려면 업그레이드하기 전에 미리 충분한 시간을 확보하십시오.

Dragon's Dogma 2에서 작은 모험을 즐기는 방법 Dragon's Dogma 2에서 작은 모험을 즐기는 방법 Mar 26, 2024 am 08:10 AM

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

Golang 컴파일 과정에 대한 자세한 설명 Golang 컴파일 과정에 대한 자세한 설명 Mar 07, 2024 am 09:24 AM

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

See all articles