当前位置: 澳门新濠3559 > 数据库 > 正文

这两个函数呢我自个儿呢之前是没有用到过,其

时间:2019-11-13 20:49来源:数据库
当目前截至呢,个人对Mysql的函数未有进展过联合的就学生运动用,都是用到了再去学学。而近些日子开始学习Linux了,所感到了以免万风姿罗曼蒂克这段时日甘休后,将此阶段之间蒙受

当目前截至呢,个人对Mysql的函数未有进展过联合的就学生运动用,都是用到了再去学学。而近些日子开始学习Linux了,所感到了以免万风姿罗曼蒂克这段时日甘休后,将此阶段之间蒙受的Mysql函数遗忘,初阶在这里对其做叁个简便的记录。

[MySQL]--)查询5天之内过华诞的同事中的闰年三月二十七日主题素材的消除进度

前言:
上次写了查询5天之内过寿辰的同事中的跨年难题的缓和进度,网址为: ,在这之中漏了四个闰年7月15日出生之日的内部情状难题,将来补给一下以此难点的管理进度:
5,补充闰年剖断
有对象提示,闰年10月二十四日出生之日的话,大概查询不到,想到确实并未有考虑到这么些极度的日期。
5.1,策动测验数据SQL,包涵一九七八-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整除的为闰年。(如二〇〇〇年正是闰年,一九〇一年不是闰年卡塔 尔(阿拉伯语:قطر‎*/
IF (p_year%4)=0 AND (p_year%100)>0 THEN
SET v_flag=0;
/*②、世纪年能被400整除的是闰年。(如2004年是闰年,1905年不是闰年) */
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 ;
积攒函数实行如下图所示:
澳门新濠3559 15.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 /*增补闰年十二月十五日的出生之日难题*/
(
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 在非闰年的时候,验证闰年5月二十二日寿辰,选择2015年非闰年测量试验
SELECT * FROM ali_users WHERE
施行SQL核准成果,要是当天是2016-02-28,看见曾经有十月三十一日的寿辰的同事被记录进入了,其实富含了十二月十二十九日、六月十五日、二月1日、二月2日、11月3日、6月4日的八字的同事。
PS:因为二月十一日在当年不设有,所以不算那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 /*补给闰年10月24日的八字方法*/
-> (
-> 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 在闰年的时候,验证闰年二月二十七日寿辰,选用二零零三年闰年测量检验
把Step#第22中学的SQL的NOW()改成'二零零二-02-28 00:10:10'来進展测量检验,SQL如下所示:**
SELECT * FROM ali_users WHERE
DATEDIFF(CAST(CONCAT(YEAR('2004-02-28 00:10:10澳门新濠3559,'),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 /*增加补充闰年7月13日的生辰方法*/
(
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 /*补给闰年3月八日的风水方法*/
-> (
-> 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>**

前言: 上次写了查询5天之内过华诞的同事中的跨年问题的缓慢解决进度,网...

明天下班前朋友啊让扶助看二个sql,是关于生日提示的,实际利用中呢是要促成提前一天提示顾客破壳日,而sql呢是用来询问后一天要过出生之日的用户。在他原本的sql中用到了CONCAT、DATEDIFF函数,那七个函数呢小编自己呢从前是从未有过用到过,所以在解决完标题之后在那记录一下用法及思路。

第黄金时代,来看CONCAT和DATEDIFF函数的概念与用法:

  CONCAT() : 用于连接八个或多少个字符串。如有任何三个参数为null,则重返值为null。

  DATEDIFF():重临多少个日子之间的气数。

其次,来看需要:

  查询出相对当天,后一天要过出生之日的客户。

在万目睽睽了须求和函数的用法之后我们来看思路:

  1、既然是要查后一天要过寿诞的客商,那大家能够回顾看作是询问生辰日期比目前几天期大学一年级天的客户,那么难题来了,那样的话只好查询到当前年、当前月份、当前天子后一天出生的客户,分明不契合,那再换种思路,假如全部客商都在同一年出生,那样我们赢得寿辰日期比目明天期大学一年级天的客户不就足以了^_^~

  2、在第11中学我们得以观望,那样看起来好疑似没什么难点了,不过稳重思索,如果当前些天期是4月31号,那后一天(也正是11月1号卡塔 尔(英语:State of Qatar)过生日的客商大器晚成旦根据1的笔触能查询的到吧?鲜明不能够。那我们再来看二月31号和一月1号,有未有想到跨年呢,没有错,正是跨年,既然那样,大家将持有顾客生日日期年份替换来当二零黄金时代四年跨年后的年份,那样依据日中间天数为1的尺度不就能够筛选出二月31号后一天过华诞的客商了吗^_^~

终极,大家来看下sql的兑现:

  1、替换+组合华诞日期:

    替换华诞日期年份为当二零生龙活虎七年:

     CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d'))

    替换出生之日日期年份为目二〇生龙活虎八年跨年二〇二〇年份:

     CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d')) 

  2、管理后出生之日日期与当不久前之间天数:

    普通:

     DATEDIFF(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d')),NOW())  

    跨年:

     DATEDIFF(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d')),NOW()) 

  3.组成,查询当今日子后一天要过寿辰的客商音信:

  

SELECT *
FROM user
WHERE
    DATEDIFF(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,'-%m-%d')),NOW()) = 1
OR
    DATEDIFF(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,'-%m-%d')),NOW()) = 1

最后:

  DATEDIFF 函数中五个参数,前二个比后贰个大时,值>=0 ,前二个比后三个小时,值<=0

笔录达成!

编辑:数据库 本文来源:这两个函数呢我自个儿呢之前是没有用到过,其

关键词: