Heim Datenbank MySQL-Tutorial [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>
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie ermittelt man ein Schaltjahr in PHP? Einführung in drei Methoden Wie ermittelt man ein Schaltjahr in PHP? Einführung in drei Methoden Mar 28, 2023 pm 03:45 PM

Ein Schaltjahr bezieht sich auf ein Schaltjahr alle vier Jahre im Gregorianischen Kalender, also ein Jahr mit 366 Tagen, das zwischen gewöhnlichen 365-Tage-Jahren eingefügt wird. Sein Zweck besteht darin, dem Sonnenjahr zu entsprechen. Gemäß den Bestimmungen des Gregorianischen Kalenders gibt es in Schaltjahren im Allgemeinen zwei Situationen: ① Das Jahr ist gleichmäßig durch 4 teilbar, aber nicht durch 100. ② Das Jahr ist gleichmäßig durch 400 teilbar. In diesem Artikel stellen wir Ihnen die Methode zur Realisierung einer Schaltjahrbeurteilung basierend auf der Programmiersprache PHP vor.

Schreiben Sie ein Programm in der Sprache C, um zu prüfen, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht Schreiben Sie ein Programm in der Sprache C, um zu prüfen, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht Sep 20, 2023 pm 03:33 PM

Ein Schaltjahr hat 366 Tage, während ein gewöhnliches Jahr 365 Tage hat. Die Aufgabe besteht darin, durch ein Programm zu überprüfen, ob ein bestimmtes Jahr ein Schaltjahr ist. Die Urteilslogik kann umgesetzt werden, indem geprüft wird, ob das Jahr durch 400 oder 4 teilbar ist. Wenn es jedoch nicht durch diese beiden Zahlen teilbar ist, handelt es sich um ein gewöhnliches Jahr. BeispielInput-:year=2000Output-:2000isaLeapYearInput-:year=101Output-:101isnotaLeapyear-AlgorithmusStartStep1->declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye

Zurück in die Zukunft So verbringen Sie 1996–24 Zurück in die Zukunft So verbringen Sie 1996–24 Mar 02, 2024 pm 12:58 PM

In „Zurück in die Zukunft 1999“ werden die Spieler mit vielen Level-Herausforderungen konfrontiert, und jedes Level bringt völlig andere Herausforderungen mit sich. Als eines der Level werden sicherlich viele Spieler darüber nachdenken. Sie wissen also, wie man dieses Level herausfordert Im Folgenden finden Sie auch relevante Freigabemethoden. Zurück in die Zukunft 1996-24 Freigabemethode 1. Nachdem Sie in einem Satz auf Level 30 gebrannt haben, warten Sie, bis der Boss betäubt ist, und verprügeln Sie ihn heftig. 2. Priorisieren Sie die Verwendung von Haupt-C und 142d, um in einer Runde zu brennen. 3. In der zweiten Runde nutzen Sie die kleinen Fähigkeiten der Hilfs- und Kindermädchen zum Brennen und die Hauptkarte C, um einen großen Zug zu bauen. 4. Der Boss wird in drei Runden betäubt und dann direkt mit seinen ultimativen Bewegungs- und Schadensfähigkeiten geschlagen.

Wuthering WavesSo bestehen Sie den Fantasyland-Schwierigkeitsgrad 3 Wuthering WavesSo bestehen Sie den Fantasyland-Schwierigkeitsgrad 3 Feb 28, 2024 pm 10:19 PM

Teilen Sie uns mit, wie Sie das Level von Ming Tide Fantasyland Schwierigkeitsgrad 3 bestehen. Viele Leute in Mingchao schließen Level 3 dieses Fantasy-Landes ab. Viele Freunde wissen noch nicht, was sie tun sollen, aber keine Sorge, der Herausgeber wird es Ihnen bringen Wenn Sie wissen, welche Strategien darin enthalten sind, kommen Sie vorbei und probieren Sie es aus. Wie kann man den Bell Turtle-Charakter im Schwierigkeitsgrad 3 bestehen? Durch die Stärkung der Resonanzfähigkeiten wird die Angriffseffizienz erhöht und der Schaden kann auch größer sein ausgetauscht. [Metapher] Wählen Sie aus den ersten drei Stufen: Sonne im Wald: Sie kann den Schaden von Ji Yan erheblich erhöhen. Wenn die Fertigkeit öfter verwendet wird, kann sie einen sehr guten kritischen Treffereffekt erzeugen. Schutzeinrichtung: Resonanztechnik verwenden

Erklären Sie den Prozess der Auswahlsortierung in der Sprache C Erklären Sie den Prozess der Auswahlsortierung in der Sprache C Sep 01, 2023 pm 01:57 PM

Die Auswahlsortierung ist ein aggressiver Algorithmus, der verwendet wird, um die kleinste Zahl aus einem Array zu finden und sie an der ersten Position zu platzieren. Das nächste zu durchlaufende Array beginnt am Index, nahe der Stelle, an der die kleinste Zahl platziert ist. Der Prozess der Auswahlsortierung wählt das erste kleinste Element in der Elementliste aus und platziert es an der ersten Position. Wiederholen Sie den gleichen Vorgang für die verbleibenden Elemente in der Liste, bis alle Elemente sortiert sind. Betrachten Sie die folgende Liste – erster Durchgang Sm=a[0]=30Sma[1]

Detaillierte Analyse der für das Win10-Upgrade benötigten Zeit Detaillierte Analyse der für das Win10-Upgrade benötigten Zeit Jan 10, 2024 am 12:00 AM

Viele Freunde möchten ihre Computersysteme auf Win10 aktualisieren, wissen aber nicht, wie lange der Upgrade-Prozess dauern wird. Heute habe ich Ihnen eine detaillierte Einführung in die Zeit gegeben, die für die Aktualisierung auf Win10 erforderlich ist. Wie lange dauert die Aktualisierung auf Win10: 1. Sie variiert zwischen etwa 40 Minuten und 2/3 Stunden, abhängig von der Leistung des Computers jedes Benutzers. 2. Die Zeit zum Konfigurieren der Leistung ist ebenfalls unterschiedlich, was eng mit der Datenmenge im alten System zusammenhängt. 3. Wenn der Computer viele Dinge und eine mechanische Tastatur hat, wird er noch langsamer. 4. Wenn Sie ein Upgrade von Win7/8 auf Win10 durchführen, dauert es etwa eineinhalb Stunden. 5. Planen Sie vor dem Upgrade ausreichend Zeit ein, um wichtige Dinge zu sichern und Verluste zu vermeiden.

So verbringen Sie ein kleines Abenteuer in Dragon's Dogma 2 So verbringen Sie ein kleines Abenteuer in Dragon's Dogma 2 Mar 26, 2024 am 08:10 AM

Ein kleines Abenteuer ist ein früher Zweig in Dragon's Dogma, wie kann diese Aufgabe also abgeschlossen werden? Spieler müssen zuerst zu Mevi gehen, diese Aufgabe hier im Supermarkt annehmen und Pillen kaufen, um diesen Zweig abzuschließen. Den detaillierten Inhalt finden Sie in diesem kleinen grafischen Leitfaden für Abenteuer und gemeinsam einen Blick darauf werfen. So überstehen Sie ein kleines Abenteuer in Dragon's Dogma 2: 1. Fahren Sie zunächst mit dem Ochsenkarren nördlich von Velenworth nach Meve. 2. Nachdem Sie in Mevi angekommen sind, gehen Sie zu Lunnais Requisiten, um Sie mitzunehmen, und führen Sie ein Gespräch mit dem NPC hier, um die Mission zu starten. 3. Dann betritt der Spieler den Laden hinter der Tür, spricht hier mit dem Onkel und kauft Pillen. 4. Kehren Sie nach dem Kauf zur Tür zurück und geben Sie dem NPC die Pillen. 5. Anschließend

Detaillierte Erläuterung des Golang-Kompilierungsprozesses Detaillierte Erläuterung des Golang-Kompilierungsprozesses Mar 07, 2024 am 09:24 AM

Detaillierte Erklärung des Golang-Kompilierungsprozesses Golang (auch bekannt als Go) ist eine von Google entwickelte Programmiersprache. Sie zeichnet sich durch Einfachheit, Effizienz, Parallelität usw. aus und hat daher breite Aufmerksamkeit und Anwendung gefunden. Beim Programmieren mit Golang ist die Kompilierung ein sehr wichtiger Schritt. In diesem Artikel wird der Golang-Kompilierungsprozess ausführlich vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Kompilierungsprozess der lexikalischen Analyse des Golang-Quellcodes (LexicalAnalysis) Der erste Schritt im Kompilierungsprozess ist das Wort

See all articles