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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Une année bissextile fait référence à une année bissextile qui se produit tous les quatre ans dans le calendrier grégorien, c'est-à-dire qu'une année de 366 jours est insérée entre les années ordinaires de 365 jours. Son but est de se conformer à l'année solaire. Selon les dispositions du calendrier grégorien, il existe généralement deux situations dans les années bissextiles : ① l'année est divisible par 4, mais pas par 100 ; ② l'année est divisible par 400 ; Dans cet article, nous vous présenterons la méthode permettant de réaliser un jugement d'année bissextile basé sur le langage de programmation PHP.

Une année bissextile compte 366 jours, tandis qu'une année ordinaire compte 365 jours. La tâche consiste à vérifier si une année donnée est une année bissextile grâce à un programme. La logique du jugement peut être mise en œuvre en vérifiant si l'année est divisible par 400 ou par 4, mais si elle n'est pas divisible par ces deux nombres, c'est une année ordinaire. ExempleInput-:year=2000Output-:2000isaLeapYearInput-:year=101Output-:101isnotaAlgorithme d'année bissextileStartStep1->declarefunctionbooltocheckifyearifaleapyearornotboolcheck(intye

Dans Retour vers le futur 1999, les joueurs seront confrontés à de nombreux défis de niveau, et chaque niveau apporte des défis complètement différents. En tant que niveau, 6-24 fera certainement réfléchir de nombreux joueurs. Vous savez comment relever ce niveau, donc le. ce qui suit apportera également des méthodes de dédouanement pertinentes. Retour vers le futur 19996-24 Méthode d'autorisation 1. Après avoir brûlé au niveau 30 en une phrase, attendez que le boss soit assommé et donnez-lui une forte raclée. 2. Donnez la priorité à l'utilisation du C principal et du 142d pour brûler en un seul tour. 3. Au deuxième tour, utilisez les petites compétences de l'auxiliaire et de la nourrice pour brûler et la carte C principale pour construire un grand mouvement. 4. Le boss sera étourdi en trois rounds, puis il sera battu directement avec ses compétences de mouvement et de dégâts ultimes.

Partagez comment passer le niveau de difficulté Ming Tide Fantasyland 3. De nombreuses personnes à Mingchao terminent le niveau 3 de ce pays fantastique. Ce niveau est en fait un peu difficile. Beaucoup d'amis ne savent pas encore quoi faire, mais ne vous inquiétez pas, l'éditeur vous l'apportera. les stratégies qu'il contient, venez essayer. Comment réussir le niveau de difficulté Ringing Tide Fantasy 3 ? Renforcer les compétences de résonance du personnage Bell Turtle peut améliorer l'effet de notre aérodynamisme, de cette façon, l'efficacité de l'attaque sera augmentée et les dégâts seront plus importants. Le remplacement des effets peut également être échangé. [Métaphore] Choisissez parmi les trois premiers niveaux : Soleil dans la forêt : cela peut considérablement augmenter les dégâts de Ji Yan si la compétence est utilisée plus de fois, elle peut produire un très bon effet de coup critique. Dispositif de protection : utiliser la technologie de résonance

Le tri par sélection est un algorithme agressif utilisé pour trouver le plus petit nombre d'un tableau et le placer en première position. Le prochain tableau à parcourir commencera à l'index, près de l'endroit où est placé le plus petit nombre. Le processus de tri par sélection sélectionne le premier plus petit élément de la liste des éléments et le place en première position. Répétez la même opération pour les éléments restants de la liste jusqu'à ce que tous les éléments soient triés. Considérez la liste suivante - premier passage Sm=a[0]=30Sma[1]

De nombreux amis souhaitent mettre à niveau leur système informatique vers le système Win10, mais ils ne savent pas combien de temps prendra le processus de mise à niveau. Aujourd'hui, je vous ai présenté une introduction détaillée au temps nécessaire pour mettre à jour vers Win10. Combien de temps faut-il pour mettre à jour vers win10 : 1. Cela varie d'environ 40 minutes à 2/3 heures selon les performances de la machine de chaque utilisateur. 2. Le temps de configuration des performances est également différent, ce qui est étroitement lié à la quantité de données dans l'ancien système. 3. Si l'ordinateur possède beaucoup de choses et un clavier mécanique, il sera encore plus lent. 4. Si vous passez de Win7/8 à Win10, cela prendra environ une heure et demie. 5. Réservez suffisamment de temps à l'avance avant la mise à niveau pour sauvegarder les éléments importants afin d'éviter toute perte.

Une petite aventure est une des premières branches de Dragon's Dogma, alors comment cette tâche peut-elle être accomplie ? Les joueurs doivent d'abord se rendre chez Mevi, accepter cette mission à l'épicerie ici et acheter des pilules pour compléter cette branche. De manière générale, c'est très simple. Le contenu détaillé se trouve dans ce petit guide graphique de mission d'aventure. et jetez un oeil ensemble. Comment survivre à une petite aventure dans Dragon's Dogma 2 : 1. Tout d'abord, prenez la charrette à bœufs au nord de Velenworth jusqu'à Meve. 2. Après votre arrivée à Mevi, rendez-vous aux accessoires de Lunnai pour vous emmener et parlez au PNJ ici pour commencer la mission. 3. Ensuite, le joueur entre dans le magasin derrière la porte, parle à l'oncle ici et achète des pilules. 4. Après l'achat, retournez à la porte et fournissez les pilules au PNJ. 5. Par la suite

Explication détaillée du processus de compilation de Golang Golang (également connu sous le nom de Go) est un langage de programmation développé par Google. Il présente les caractéristiques de simplicité, d'efficacité, de concurrence, etc., il a donc reçu une attention et une application généralisées. Lors de la programmation avec Golang, la compilation est une étape très importante. Cet article présentera en détail le processus de compilation de Golang et fournira des exemples de code spécifiques. 1. Processus de compilation du code source Golang Analyse lexicale (LexicalAnalysis) La première étape du processus de compilation est le mot
