[MySQL]--)查询5天之内过生日的同事中的跨年问题的解决过程_MySQL
前言:
遇到朋友提问,如下:
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,总结

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

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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



Pejabat Pembelian yang Hilang akan dikemas kini pada pukul 11 pagi pada 28 Februari Pemain boleh pergi ke Taobao untuk mencari di Pejabat Pembelian dan memilih kategori kedai untuk dibeli Kali ini kami membawakan anda siri pesta ulang tahun MBCC dan peranti Kalendar Meja 2024 bersama-sama lihat butiran produk kali ini. Tiada Tempoh Hilang Pejabat Pembelian: Peranti siri kalendar dan hari jadi baharu! Terdapat sesuatu yang baru di Pejabat Perolehan yang Hilang! —Masa pra-jualan: 11:00 pada 28 Februari 2024 - 23:59 pada 13 Mac 2024. Alamat pembelian: Cari Taobao [Indefinite Lost Purchasing Office] dan pilih kategori [Kedai] untuk memasuki kedai untuk pembelian; pengenalan: Peranti baharu yang dikeluarkan kali ini ialah siri parti hari jadi MBCC dan peranti kalendar meja 2024 Sila klik pada imej yang panjang untuk mendapatkan butiran. Pejabat Pembelian memperkenalkan peranti baharu—pelajar MBCC

Love and Deep Space telah disahkan akan dikemas kini pada 1 Mac untuk melancarkan acara tema hari jadi Qi Yu kupon harapan ruang dan ganjaran lain yang menanti anda Teruskan Turun dan ikuti editor untuk melihat butiran acara ini. Acara tema hari jadi Qi Yu iaitu Love and Deep Space akan bermula: alami plot hari jadi eksklusif Sertai acara itu dan alami plot hari jadi eksklusif. Terdapat juga ganjaran berwarna-warni seperti pemikiran terhad hari lahir, pakaian harian dan "Deep Space Wishing Baucar·Masa Terhad*20" menanti anda! Masa acara: Selepas kemas kini pada 1 Mac ~ 4:59 pagi pada 8 Mac Pelukan Eksklusif: Hari jadi lima bintang terlepas masa terhad acara ucapan UP Semasa tempoh terhad lima bintang terlepas "Qi Yu·Adventures in this Life" kebarangkalian berharap sangat meningkat untuk masa yang terhad. *Selepas acara, gambar ini

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

Kaedah pelaksanaan menukar hari jadi PHP kepada cap masa dikongsi dalam pembangunan harian Kadangkala kita perlu menukar hari lahir pengguna kepada borang cap masa untuk melaksanakan lebih banyak operasi, seperti mengira umur, membandingkan masa, dsb. Artikel ini akan berkongsi cara menggunakan PHP untuk menukar hari lahir kepada cap masa dan memberikan contoh kod khusus. PHP menyediakan pelbagai fungsi pemprosesan tarikh dan masa, dan kami boleh menggunakan fungsi ini untuk menyelesaikan operasi menukar hari lahir kepada cap masa. Pertama, kita perlu mendapatkan tarikh hari lahir yang dimasukkan oleh pengguna, yang secara amnya boleh diperoleh melalui borang, dan kemudian digunakan

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.

PHP ialah bahasa skrip sebelah pelayan yang popular yang biasa digunakan untuk pembangunan laman web dan penjanaan halaman web dinamik. Apabila membangunkan tapak web, ia selalunya melibatkan pemprosesan maklumat hari lahir pengguna Kadangkala perlu menukar hari lahir yang diberikan oleh pengguna kepada cap masa untuk penyimpanan atau pengiraan. Berikut akan memperkenalkan cara menggunakan PHP untuk menukar hari lahir kepada cap masa, dan memberikan contoh kod khusus. Pertama, kita perlu memahami format storan hari lahir. Secara umumnya, format hari lahir ialah "tahun-bulan-hari", seperti "1990-05-20". Kami akan menggunakan data hari lahir dalam format ini,
