[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>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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.

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

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.

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

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]

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.

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 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
