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

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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Love and Deep Space Qi Yu의 생일 테마 이벤트가 곧 시작됩니다. 독점 생일 축하 플롯을 경험해 보세요. Love and Deep Space Qi Yu의 생일 테마 이벤트가 곧 시작됩니다. 독점 생일 축하 플롯을 경험해 보세요. Feb 29, 2024 pm 03:00 PM

Love and Deep Space는 Qi Yu의 생일 테마 이벤트를 시작하기 위해 3월 1일 업데이트가 확정되었습니다. 플레이어는 이벤트에 참여하여 독점 생일 축하 플롯을 경험할 수 있습니다. 이 외에도 생일 한정 생각, 일일 의상, 20심이 있습니다. 공간을 기원하는 쿠폰과 기타 보상이 여러분을 기다리고 있습니다. 계속 아래로 내려와서 편집자를 따라가면 이 이벤트의 세부 사항을 볼 수 있습니다. Love and Deep Space Qi Yu의 생일 테마 이벤트가 곧 시작됩니다. 독점 생일 플롯을 경험하고 이벤트에 참여하여 독점 생일 플롯을 경험해 보세요. 생일 한정 생각, 일상복, "깊은 우주 소원권·기간 한정*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 학생

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: 스킬을 여러 번 사용하면 매우 좋은 치명타 효과를 낼 수 있습니다. 보호 장치: 공진 기술 사용

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

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

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

See all articles