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

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

Jun 01, 2016 pm 01:02 PM
proses tahun lompat

前言:
上次写了查询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>
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menentukan tahun lompat dalam php? Pengenalan kepada tiga kaedah Bagaimana untuk menentukan tahun lompat dalam php? Pengenalan kepada tiga kaedah Mar 28, 2023 pm 03:45 PM

Tahun lompat merujuk kepada tahun lompat yang berlaku setiap empat tahun dalam kalendar Gregorian, iaitu, tahun 366 hari dimasukkan antara tahun biasa 365 hari Tujuannya adalah untuk mematuhi tahun solar. Menurut peruntukan kalendar Gregorian, secara amnya terdapat dua situasi dalam tahun lompat: ① tahun boleh dibahagi sama rata dengan 4, tetapi bukan 100 ② tahun boleh dibahagikan sama rata dengan 400; Dalam artikel ini, kami akan memperkenalkan kepada anda kaedah merealisasikan pertimbangan tahun lompat berdasarkan bahasa pengaturcaraan PHP.

Tulis program dalam bahasa C untuk menyemak sama ada tahun tertentu adalah tahun lompat atau tidak Tulis program dalam bahasa C untuk menyemak sama ada tahun tertentu adalah tahun lompat atau tidak Sep 20, 2023 pm 03:33 PM

Tahun lompat mempunyai 366 hari, manakala tahun biasa mempunyai 365 hari Tugasnya adalah untuk menyemak sama ada tahun tertentu adalah tahun lompat melalui program. Logik penghakiman boleh dilaksanakan dengan menyemak sama ada tahun itu boleh dibahagikan dengan 400 atau 4, tetapi jika ia tidak boleh dibahagikan dengan dua nombor ini, ia adalah tahun biasa. ContohInput-:year=2000Output-:2000isaLeapYearInput-:year=101Output-:101isnotaLeapyear algorithmStartStep1->declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye

Kembali ke Masa Depan Bagaimana untuk menghabiskan 19996-24 Kembali ke Masa Depan Bagaimana untuk menghabiskan 19996-24 Mar 02, 2024 pm 12:58 PM

Dalam Back to the Future 1999, pemain akan menghadapi banyak cabaran peringkat, dan setiap peringkat membawa cabaran yang sama sekali berbeza Sebagai salah satu peringkat, 6-24 pasti akan mempunyai ramai pemain yang memikirkannya, jadi berikut juga akan membawa kaedah pelepasan yang berkaitan. Kembali ke Masa Depan 19996-24 Kaedah Pembersihan 1. Selepas membakar tahap 30 dalam satu ayat, tunggu bos terpegun dan berikan dia pukulan berat. 2. Utamakan menggunakan C utama dan 142d untuk membakar dalam satu pusingan. 3. Pada pusingan kedua, gunakan kemahiran kecil pembantu dan pengasuh untuk membakar dan kad C utama untuk membina gerakan yang besar. 4. Bos akan terpegun dalam tiga pusingan, dan kemudian dia akan dipukul secara langsung dengan kemahiran bergerak dan kerosakan yang muktamadnya.

Wuthering WavesCara melepasi kesukaran Fantasyland 3 Wuthering WavesCara melepasi kesukaran Fantasyland 3 Feb 28, 2024 pm 10:19 PM

Kongsi cara melepasi tahap Ming Tide Fantasyland Difficulty 3. Ramai orang di Mingchao sedang menyelesaikan tahap 3 tanah fantasi ini sebenarnya agak sukar. Ramai rakan tidak tahu apa yang perlu dilakukan, tetapi jangan risau, editor akan membawanya kepada anda strategi di dalamnya, datang dan mencubanya. Bagaimana untuk melepasi Ringing Tide Fantasy Tahap Kesukaran 3? Memperkukuh kemahiran resonans watak Bell Turtle boleh meningkatkan kesan aerodinamik kita dengan cara ini, kecekapan serangan akan meningkat dan kerosakan akan lebih besar Penggantian kesan juga boleh ditukar. [Metafora] Pilih daripada tiga peringkat pertama: Matahari di Hutan: Ia boleh meningkatkan kerosakan Ji Yan dengan banyak Jika kemahiran digunakan lebih banyak kali, ia boleh menghasilkan kesan pukulan kritikal yang sangat baik. Peranti pelindung: Gunakan teknologi resonans

Terangkan proses pengisihan pemilihan dalam bahasa C Terangkan proses pengisihan pemilihan dalam bahasa C Sep 01, 2023 pm 01:57 PM

Isih pemilihan ialah algoritma agresif yang digunakan untuk mencari nombor terkecil daripada tatasusunan dan meletakkannya di kedudukan pertama. Tatasusunan seterusnya yang akan dilalui akan bermula pada indeks, berhampiran dengan tempat nombor terkecil diletakkan. Proses isihan pemilihan memilih elemen terkecil pertama dalam senarai elemen dan meletakkannya di kedudukan pertama. Ulangi operasi yang sama untuk elemen yang tinggal dalam senarai sehingga semua elemen diisih. Pertimbangkan senarai berikut - lulus pertama Sm=a[0]=30Sma[1]

Analisis terperinci masa yang diperlukan untuk naik taraf win10 Analisis terperinci masa yang diperlukan untuk naik taraf win10 Jan 10, 2024 am 12:00 AM

Ramai rakan ingin menaik taraf sistem komputer mereka kepada sistem win10, tetapi mereka tidak tahu berapa lama proses naik taraf akan diambil Hari ini saya telah membawakan anda pengenalan terperinci tentang masa yang diperlukan untuk mengemas kini kepada win10. Berapa lama masa yang diambil untuk mengemas kini kepada win10: 1. Ia berbeza dari kira-kira 40 minit hingga 2/3 jam bergantung pada prestasi mesin setiap pengguna. 2. Masa untuk mengkonfigurasi prestasi juga berbeza, yang berkait rapat dengan jumlah data dalam sistem lama. 3. Jika komputer mempunyai banyak perkara dan papan kekunci mekanikal, ia akan menjadi lebih perlahan. 4. Jika anda menaik taraf daripada win7/8 kepada win10, ia akan mengambil masa kira-kira satu setengah jam. 5. Simpan masa yang cukup lebih awal sebelum menaik taraf untuk membuat sandaran perkara penting untuk mengelakkan kerugian.

Bagaimana untuk menghabiskan sedikit pengembaraan dalam Dragon's Dogma 2 Bagaimana untuk menghabiskan sedikit pengembaraan dalam Dragon's Dogma 2 Mar 26, 2024 am 08:10 AM

Pengembaraan kecil adalah cabang awal dalam Dogma Naga, jadi bagaimanakah tugasan ini boleh diselesaikan? Pemain perlu pergi ke Mevi, menerima misi ini di kedai runcit di sini, dan membeli pil untuk melengkapkan cawangan ini Secara umumnya, kandungan terperinci boleh didapati dalam panduan grafik misi kecil ini dan lihat bersama. Bagaimana untuk bertahan dalam pengembaraan kecil dalam Dragon's Dogma 2: 1. Mula-mula, bawa kereta lembu ke utara Velenworth ke Meve. 2. Selepas tiba di Mevi, pergi ke alat peraga Lunnai untuk membawa anda, dan bercakap dengan NPC di sini untuk memulakan misi. 3. Kemudian pemain masuk ke kedai di belakang pintu, bercakap dengan pakcik di sini, dan membeli pil. 4. Selepas membeli, kembali ke pintu dan sediakan pil kepada NPC. 5. Seterusnya

Penjelasan terperinci proses penyusunan Golang Penjelasan terperinci proses penyusunan Golang Mar 07, 2024 am 09:24 AM

Penjelasan terperinci tentang proses penyusunan Golang Golang (juga dikenali sebagai Go) ialah bahasa pengaturcaraan yang dibangunkan oleh Google Ia mempunyai ciri-ciri kesederhanaan, kecekapan, keselarasan, dan lain-lain, jadi ia telah mendapat perhatian dan aplikasi yang meluas. Apabila pengaturcaraan dengan Golang, kompilasi merupakan langkah yang sangat penting Artikel ini akan memperkenalkan proses penyusunan Golang secara terperinci dan memberikan contoh kod khusus. 1. Proses penyusunan kod sumber Golang Analisis Leksikal (Analisis Leksikal) Langkah pertama dalam proses penyusunan ialah perkataan

See all articles