八、MySQL 常用函数汇总(1)

文章目录

MySQL 提供了众多功能强大、方便易用的函数。使用这些函数,可以极大地提高用户对数据库的管理效率。MySQL 中的函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数和加密函数等函数。本文将介绍 MySQL 中这些函数的功能和用法。

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)

一、函数

1.1 函数简介

函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既 提高了代码效率,又 提高了可维护性 。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作,使用这些函数,数据库功能可以变得更加强大,可以更加灵活地满足不同用户的需求,可以极大地 提高用户对数据库的管理效率

从函数定义的角度出发,我们可以将函数分成 内置函数自定义函数。在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的,本文讲解的是 SQL 的内置函数。MySQL 提供了丰富的内置函数,各类函数从功能方面主要分为 数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数和加密函数 等函数。本文将分类介绍不同函数的使用方法。

1.2 不同DBMS函数的差异

我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即 DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是被 DBMS 同时支持的。比如,大多数 DBMS 使用 (||) 或者 (+) 来做拼接符,而在 MySQL 中的字符串拼接函数为 concat()。大部分 DBMS 会有自己特定的函数,这就意味着采用 SQL 函数的代码可移植性是很差的,因此在使用函数的时候需要特别注意。

二、数学函数

数学函数主要用来处理数值数据,数学函数主要有绝对值函数、三角函数(包括正弦函数、余弦函数、正切函数、余切函数等)、对数函数、随机数函数等。在产生错误时,数学函数将会返回空值 NULL。本小节将介绍各种数学函数的作用和用法。

2.1 绝对值函数ABS(x)和返回圆周率的函数PI()

ABS(X) 返回 X 的绝对值。【示例1】求2、-3.3 和 -33 的绝对值,输入语句如下:

mysql> SELECT ABS(2), ABS(-3.3), ABS(-33);
+--------+-----------+----------+
| ABS(2) | ABS(-3.3) | ABS(-33) |
+--------+-----------+----------+
|      2 |       3.3 |       33 |
+--------+-----------+----------+
1 row in set (0.00 sec)
#正数的绝对值为其本身,2的绝对值为2。负数的绝对值为其相反数,-3.3的绝对值为3.3 -33的绝对值为33。

PI()返回圆周率 π 的值,默认显示小数位数是6位。【示例2】返回圆周率值,输入语句如下:

mysql> SELECT PI();
+----------+
| PI()     |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)

mysql>

2.2 平方根函数SQRT(x)和求余函数MOD(x,y)

SQRT(x) 返回非负数x的二次平方根。 【示例3】求9、40和-49的二次平方根,输入语句如下:

#负数没有平方根,因此-49的平方根返回的结果为NULL。
mysql> SELECT SQRT(9), SQRT(40), SQRT(-49);
+---------+-------------------+-----------+
| SQRT(9) | SQRT(40)          | SQRT(-49) |
+---------+-------------------+-----------+
|       3 | 6.324555320336759 |      NULL |
+---------+-------------------+-----------+
1 row in set (0.00 sec)

MOD(x,y) 返回 xy 除后的余数,MOD() 对于带有小数部分的数值也起作用,它返回除法运算后的精确余数。 【示例4】对(31,8)、(234, 10)、(45.5,6)进行求余运算,输入语句如下:

mysql> SELECT MOD(31,8),MOD(234, 10),MOD(45.5,6);
+-----------+--------------+-------------+
| MOD(31,8) | MOD(234, 10) | MOD(45.5,6) |
+-----------+--------------+-------------+
|         7 |            4 |         3.5 |
+-----------+--------------+-------------+
1 row in set (0.00 sec)

2.3 获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)

CEIL(x)CEILING(x) 的意义相同,返回不小于 x 的最小整数值,返回值转化为一个 BIGINT 【示例5】使用 CEILING 函数返回最小整数,输入语句如下:

mysql> SELECT  CEIL(-3.35),CEILING(3.35);
+-------------+---------------+
| CEIL(-3.35) | CEILING(3.35) |
+-------------+---------------+
|          -3 |             4 |
+-------------+---------------+
1 row in set (0.00 sec)
#-3.35为负数,不小于-3.35的最小整数为-3,因此返回值为-3;不小于3.35的最小整数为4,因此返回值为4。

FLOOR(x) 返回不大于 x 的最大整数值,返回值转化为一个 BIGINT【示例6】使用FLOOR函数返回最大整数,输入语句如下:

mysql> SELECT FLOOR(-3.35), FLOOR(3.35);
+--------------+-------------+
| FLOOR(-3.35) | FLOOR(3.35) |
+--------------+-------------+
|           -4 |           3 |
+--------------+-------------+
1 row in set (0.00 sec)

2.4 获取随机数的函数RAND()和RAND(x)

RAND(x) 返回一个随机浮点值v,范围在0到1之间 (0 ≤ v ≤ 1.0)。若已指定一个整数参数x,则它被用作种子值,用来产生重复序列。 【示例7】使用RAND()函数产生随机数,输入语句如下:

#可以看到,不带参数的RAND()每次产生的随机数值是不同的。
mysql> SELECT RAND(),RAND(),RAND();
+--------------------+---------------------+--------------------+
| RAND()             | RAND()              | RAND()             |
+--------------------+---------------------+--------------------+
| 0.7769518548408075 | 0.44221097178963104 | 0.8801993251593777 |
+--------------------+---------------------+--------------------+
1 row in set (0.00 sec)

【示例8】使用RAND(x)函数产生随机数,输入语句如下:

mysql> SELECT RAND(10),RAND(10),RAND(11);
+--------------------+--------------------+-------------------+
| RAND(10)           | RAND(10)           | RAND(11)          |
+--------------------+--------------------+-------------------+
| 0.6570515219653505 | 0.6570515219653505 | 0.907234631392392 |
+--------------------+--------------------+-------------------+
1 row in set (0.00 sec)

可以看到,当 RAND(x) 的参数相同时,将产生相同的随机数,不同的 x 产生的随机数值不同。

2.5 函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)

ROUND(x) 返回最接近于参数 x 的整数,对 x 值进行四舍五入。【示例9】使用ROUND(x)函数对操作数进行四舍五入,输入语句如下:

mysql> SELECT ROUND(-1.14),ROUND(-1.67), ROUND(1.14),ROUND(1.66);
+--------------+--------------+-------------+-------------+
| ROUND(-1.14) | ROUND(-1.67) | ROUND(1.14) | ROUND(1.66) |
+--------------+--------------+-------------+-------------+
|           -1 |           -2 |           1 |           2 |
+--------------+--------------+-------------+-------------+
1 row in set (0.00 sec)

可以看到,四舍五入处理之后,只保留了各个值的整数部分。ROUND(x,y) 返回最接近于参数 x 的数,其值保留到小数点后面 y 位,若 y 为负值,则将保留 x 值到小数点左边 y 位。 【示例10】使用ROUND(x,y)函数对操作数x进行四舍五入操作,结果保留小数点后面y位,输入语句如下:

mysql> SELECT ROUND(1.38, 1), ROUND(1.38, 0), ROUND(232.38, -1), ROUND(232.38,-2);
+----------------+----------------+-------------------+------------------+
| ROUND(1.38, 1) | ROUND(1.38, 0) | ROUND(232.38, -1) | ROUND(232.38,-2) |
+----------------+----------------+-------------------+------------------+
|            1.4 |              1 |               230 |              200 |
+----------------+----------------+-------------------+------------------+
1 row in set (0.00 sec)

ROUND(1.38, 1) 保留小数点后面1位,四舍五入的结果为1.4;ROUND(1.38, 0) 保留小数点后面0位,即返回四舍五入后的整数值;ROUND(23.38, -1) 和 ROUND (232.38,-2) 分别保留小数点左边1位和2位。

提示:y值为负数时,保留的小数点左边的相应位数直接保存为0,不进行四舍五入。

TRUNCATE(x,y) 返回被舍去至小数点后 y 位的数字 x。若 y 的值为 0,则结果不带有小数点或不带有小数部分。若 y 设为负数,则截去(归零) x 小数点左起第 y 位开始后面所有低位的值。 【示例11】使用TRUNCATE(x,y)函数对操作数进行截取操作,结果保留小数点后面指定y位,输入语句如下:

mysql> SELECT TRUNCATE(1.31,1), TRUNCATE(1.99,1), TRUNCATE(1.99,0), TRUNCATE(19.99,-1);
+------------------+------------------+------------------+--------------------+
| TRUNCATE(1.31,1) | TRUNCATE(1.99,1) | TRUNCATE(1.99,0) | TRUNCATE(19.99,-1) |
+------------------+------------------+------------------+--------------------+
|              1.3 |              1.9 |                1 |                 10 |
+------------------+------------------+------------------+--------------------+
1 row in set (0.00 sec)

TRUNCATE(1.31,1) 和 TRUNCATE(1.99,1) 都保留小数点后1位数字,返回值分别为 1.3和1.9;TRUNCATE(1.99,0) 返回整数部分值1;TRUNCATE(19.99,-1) 截去小数点左边第1位后面的值,并将整数部分的1位数字设置0,结果为10。

提示:ROUND(x,y)函数在截取值的时候会四舍五入,而TRUNCATE (x,y)直接截取值,并不进行四舍五入。

2.6 符号函数SIGN(x)

SIGN(x) 返回参数的符号,x 的值分别为负数、零或正数时,返回结果依次为 -1、0或1。 【示例12】使用SIGN函数返回参数的符号,输入语句如下:

#SIGN(-21)返回-1;SIGN(0)返回0;SIGN(21)返回1。
mysql> SELECT SIGN(-21),SIGN(0), SIGN(21);
+-----------+---------+----------+
| SIGN(-21) | SIGN(0) | SIGN(21) |
+-----------+---------+----------+
|        -1 |       0 |        1 |
+-----------+---------+----------+
1 row in set (0.00 sec)

2.7 幂运算函数POW(x,y)、POWER(x,y)和EXP(x)

POW(x,y) 或者 POWER(x,y) 函数返回 xy 次方(乘方) 的结果值。 【示例13】使用POW和POWER函数进行乘方运算,输入语句如下:

#可以看到,POW和POWER的结果是相同的,POW(2,2)和POWER(2,2)返回2的2次方,结果都是4
# POW(2,-2)和POWER(2,-2)都返回2的-2次方,结果为4的倒数,即0.25。
mysql> SELECT POW(2,2), POWER(2,2),POW(2,-2), POWER(2,-2);
+----------+------------+-----------+-------------+
| POW(2,2) | POWER(2,2) | POW(2,-2) | POWER(2,-2) |
+----------+------------+-----------+-------------+
|        4 |          4 |      0.25 |        0.25 |
+----------+------------+-----------+-------------+
1 row in set (0.00 sec)

EXP(x) 返回 e(数学中e的值约为2.7182818284)x 乘方后的值。 【示例14】使用EXP函数计算e的乘方,输入语句如下:

mysql> SELECT EXP(3),EXP(-3),EXP(0);
+--------------------+----------------------+--------+
| EXP(3)             | EXP(-3)              | EXP(0) |
+--------------------+----------------------+--------+
| 20.085536923187668 | 0.049787068367863944 |      1 |
+--------------------+----------------------+--------+
1 row in set (0.00 sec)

2.8 对数运算函数LOG(x)和LOG10(x)

LOG(x) 返回 x 的自然对数,x 相对于基数 e 的对数。 【示例15】使用LOG(x)函数计算自然对数,输入语句如下:

mysql> SELECT LOG(3), LOG(-3);
+--------------------+---------+
| LOG(3)             | LOG(-3) |
+--------------------+---------+
| 1.0986122886681098 |    NULL |
+--------------------+---------+
1 row in set, 1 warning (0.00 sec)
#对数定义域不能为负数,因此LOG(-3)返回结果为NULL。

LOG10(x) 返回 x 的基数为 10 的对数。 【示例16】使用LOG10计算以10为基数的对数,输入语句如下:

mysql> SELECT LOG10(2), LOG10(100), LOG10(-100);
+--------------------+------------+-------------+
| LOG10(2)           | LOG10(100) | LOG10(-100) |
+--------------------+------------+-------------+
| 0.3010299956639812 |          2 |        NULL |
+--------------------+------------+-------------+
1 row in set, 1 warning (0.00 sec)

2.9 其他数学函数(不怎么常用)

1、RADIANS(x) 将参数 x 由角度转化为弧度。

mysql> SELECT RADIANS(90),RADIANS(180);
+--------------------+-------------------+
| RADIANS(90)        | RADIANS(180)      |
+--------------------+-------------------+
| 1.5707963267948966 | 3.141592653589793 |
+--------------------+-------------------+
1 row in set (0.00 sec)

2、DEGREES(x) 将参数 x 由弧度转化为角度。

mysql> SELECT DEGREES(PI()), DEGREES(PI() / 2);
+---------------+-------------------+
| DEGREES(PI()) | DEGREES(PI() / 2) |
+---------------+-------------------+
|           180 |                90 |
+---------------+-------------------+
1 row in set (0.00 sec)

3、SIN(x) 返回 x 正弦,其中 x 为弧度值。

mysql> SELECT SIN(1), ROUND(SIN(PI()));
+--------------------+------------------+
| SIN(1)             | ROUND(SIN(PI())) |
+--------------------+------------------+
| 0.8414709848078965 |                0 |
+--------------------+------------------+
1 row in set (0.00 sec)

4、ASIN(x) 返回 x 的反正弦,即正弦为 x 的值。若 x 不在 -11 的范围之内,则返回 NULL

mysql> SELECT ASIN(0.8414709848078965), ASIN(3);
+--------------------------+---------+
| ASIN(0.8414709848078965) | ASIN(3) |
+--------------------------+---------+
|                        1 |    NULL |
+--------------------------+---------+
1 row in set (0.00 sec)

5、COS(x) 返回 x 的余弦,其中 x 为弧度值。

mysql> SELECT COS(0),COS(PI()),COS(1);
+--------+-----------+--------------------+
| COS(0) | COS(PI()) | COS(1)             |
+--------+-----------+--------------------+
|      1 |        -1 | 0.5403023058681398 |
+--------+-----------+--------------------+
1 row in set (0.00 sec)

6、ACOS(x) 返回 x 的反余弦,即余弦是 x 的值。若 x 不在 -1~1 的范围之内,则返回 NULL

mysql> SELECT ACOS(1),ACOS(0), ROUND(ACOS(0.5403023058681398));
+---------+--------------------+---------------------------------+
| ACOS(1) | ACOS(0)            | ROUND(ACOS(0.5403023058681398)) |
+---------+--------------------+---------------------------------+
|       0 | 1.5707963267948966 |                               1 |
+---------+--------------------+---------------------------------+
1 row in set (0.00 sec)

7、TAN(x) 返回 x 的正切,其中 x 为给定的弧度值。

mysql> SELECT TAN(0.3), ROUND(TAN(PI()/4));
+---------------------+--------------------+
| TAN(0.3)            | ROUND(TAN(PI()/4)) |
+---------------------+--------------------+
| 0.30933624960962325 |                  1 |
+---------------------+--------------------+
1 row in set (0.00 sec)

8、ATAN(x) 返回 x 的反正切,即正切为 x 的值。

#由结果可以看到,函数ATAN和TAN互为反函数。
mysql> SELECT ATAN(0.30933624960962325), ATAN(1);
+---------------------------+--------------------+
| ATAN(0.30933624960962325) | ATAN(1)            |
+---------------------------+--------------------+
|                       0.3 | 0.7853981633974483 |
+---------------------------+--------------------+
1 row in set (0.00 sec)

9、COT(x) 返回 x 的余切。

#由结果可以看到,函数COT和TAN互为倒函数。
mysql> SELECT COT(0.3), 1/TAN(0.3),COT(PI() / 4);
+--------------------+--------------------+--------------------+
| COT(0.3)           | 1/TAN(0.3)         | COT(PI() / 4)      |
+--------------------+--------------------+--------------------+
| 3.2327281437658275 | 3.2327281437658275 | 1.0000000000000002 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)

三、字符串函数

字符串函数主要用来处理数据库中的字符串数据。MySQL中的字符串函数有字符串长度计算函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。本小节将介绍各种字符串函数的作用和用法。说明:无论是在Java、Python等编程语言中亦或是在 MySQL 数据库中,字符串都是一种常用的数据类型,所以掌握其相关的方法及函数也非常重要。

3.1 计算字符串字符数的函数和字符串长度的函数

CHAR_LENGTH(str) 返回值为字符串 str 所包含的字符个数,一个多字节字符算作一个单字符。【示例3.1】使用CHAR_LENGTH函数计算字符串字符个数,输入语句如下:

mysql> SELECT CHAR_LENGTH('date'), CHAR_LENGTH('amo');
+---------------------+--------------------+
| CHAR_LENGTH('date') | CHAR_LENGTH('amo') |
+---------------------+--------------------+
|                   4 |                  3 |
+---------------------+--------------------+
1 row in set (0.00 sec)

LENGTH(str) 返回值为字符串的字节长度,使用 utf8(UNICODE的一种变长字符编码,又称万国码)编码字符集时,一个汉字是3字节,一个数字或字母为1字节。 【示例3.2】使用LENGTH函数计算字符串长度,输入语句如下:

#计算的结果与CHAR_LENGTH相同,因为英文字符的个数和所占的字节相同,一个字符占1字节
mysql> SELECT LENGTH('date'), LENGTH('amo');
+----------------+---------------+
| LENGTH('date') | LENGTH('amo') |
+----------------+---------------+
|              4 |             3 |
+----------------+---------------+
1 row in set (0.00 sec)

mysql> SELECT LENGTH('date'), LENGTH('我是');
+----------------+----------------+
| LENGTH('date') | LENGTH('我是') |
+----------------+----------------+
|              4 |              4 |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> SELECT CHAR_LENGTH('date'), CHAR_LENGTH('我是');
+---------------------+---------------------+
| CHAR_LENGTH('date') | CHAR_LENGTH('我是') |
+---------------------+---------------------+
|                   4 |                   2 |
+---------------------+---------------------+
1 row in set (0.00 sec)

3.2 合并字符串函数CONCAT(s1,s2,…)、CONCAT_WS(x,s1,s2,…)

CONCAT(s1,s2,…) 返回结果为连接参数产生的字符串,或许有一个或多个参数。如有任何一个参数为NULL,则返回值为NULL;如果所有参数均为非二进制字符串,则结果为非二进制字符串;如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。

【示例3.3】使用CONCAT函数连接字符串,输入语句如下:

mysql> SELECT CONCAT('My SQL', '8.0'),CONCAT('My',NULL, 'SQL');
+-------------------------+--------------------------+
| CONCAT('My SQL', '8.0') | CONCAT('My',NULL, 'SQL') |
+-------------------------+--------------------------+
| My SQL8.0               | NULL                     |
+-------------------------+--------------------------+
1 row in set (0.00 sec)

CONCAT_WS(x,s1,s2,…) 中,CONCAT_WS 代表 CONCAT With Separator,是 CONCAT() 的特殊形式。第一个参数 x 是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。 【示例3.4】使用CONCAT_WS函数连接带分隔符的字符串,输入语句如下:

mysql> SELECT CONCAT_WS('-', '1st','2nd', '3rd'), CONCAT_WS('*', '1st', NULL, '3rd');
+------------------------------------+------------------------------------+
| CONCAT_WS('-', '1st','2nd', '3rd') | CONCAT_WS('*', '1st', NULL, '3rd') |
+------------------------------------+------------------------------------+
| 1st-2nd-3rd                        | 1st*3rd                            |
+------------------------------------+------------------------------------+
1 row in set (0.00 sec)

3.3 替换字符串的函数INSERT(s1,x,len,s2)

INSERT(s1,x,len,s2) 函数将字符串 s1x 位置开始、长度为 len 的字符串用字符串 s2 替换。 如果 x 超过字符串长度,则返回值为原始字符串。如果 len 的长度大于其他字符串的长度,则从位置 x 开始替换。若任何一个参数为 NULL,则返回值为 NULL【示例3.5】使用INSERT函数进行字符串替代操作,输入语句如下:

#第二个函数INSERT('Quest', -1, 4, 'What')中起始位置-1超出了字符串长度,直接返回原字符;
SELECT INSERT('Quest', 2, 4, 'What') AS col1,INSERT('Quest', -1, 4, 'What') AS col2,INSERT('Quest', 3, 100, 'Wh') AS col3;
+-------+-------+------+
| col1  | col2  | col3 |
+-------+-------+------+
| QWhat | Quest | QuWh |
+-------+-------+------+
1 row in set (0.00 sec)

3.4 字母大小写转换函数

LOWER (str) 或者 LCASE (str) 可以将字符串 str 中的字母字符全部转换成小写字母。 【示例3.6】使用LOWER函数或者LCASE函数,将字符串中所有字母字符转换为小写,输入语句如下:

mysql> SELECT LOWER('BEAUTIFUL'), LCASE('Well');
+--------------------+---------------+
| LOWER('BEAUTIFUL') | LCASE('Well') |
+--------------------+---------------+
| beautiful          | well          |
+--------------------+---------------+
1 row in set (0.00 sec)

UPPER(str) 或者 UCASE(str) 可以将字符串 str 中的字母字符全部转换成大写字母。 【示例3.7】使用UPPER函数或者UCASE函数,将字符串中所有字母字符转换为大写,输入语句如下:

mysql> SELECT UPPER('amoxiang'), UCASE('AmoXiang');
+-------------------+-------------------+
| UPPER('amoxiang') | UCASE('AmoXiang') |
+-------------------+-------------------+
| AMOXIANG          | AMOXIANG          |
+-------------------+-------------------+
1 row in set (0.00 sec)

3.5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)

LEFT(s,n) 返回字符串 s 开始的最左边 n 个字符。 【示例3.8】使用LEFT函数返回字符串中左边的字符,输入语句如下:

mysql> SELECT LEFT('football', 5);
+---------------------+
| LEFT('football', 5) |
+---------------------+
| footb               |
+---------------------+
1 row in set (0.00 sec)

RIGHT(s,n) 返回字符串 str 最右边的 n 个字符。 【示例3.9】使用RIGHT函数返回字符串中右边的字符,输入语句如下:

mysql> SELECT RIGHT('football', 4);
+----------------------+
| RIGHT('football', 4) |
+----------------------+
| ball                 |
+----------------------+
1 row in set (0.00 sec)

3.6 填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)

LPAD(s1,len,s2) 返回字符串 s1,其左边由字符串 s2 填补到 len 字符长度。假如 s1 的长度大于 len,则返回值被缩短至 len 字符。 【示例3.10】使用LPAD函数对字符串进行填充操作,输入语句如下:

mysql> SELECT LPAD('hello',4,'??'), LPAD('hello',10,'??');
+----------------------+-----------------------+
| LPAD('hello',4,'??') | LPAD('hello',10,'??') |
+----------------------+-----------------------+
| hell                 | ?????hello            |
+----------------------+-----------------------+
1 row in set (0.00 sec)

RPAD(s1,len,s2) 返回字符串 sl,其右边被字符串 s2 填补至 len 字符长度。假如字符串 s1 的长度大于 len,则返回值被缩短到 len 字符长度。 【示例3.11】使用RPAD函数对字符串进行填充操作,输入语句如下:

mysql> SELECT RPAD('hello',4,'?'), RPAD('hello',10,'?');
+---------------------+----------------------+
| RPAD('hello',4,'?') | RPAD('hello',10,'?') |
+---------------------+----------------------+
| hell                | hello?????           |
+---------------------+----------------------+
1 row in set (0.00 sec)

3.7 删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)

LTRIM(s) 返回字符串 s,字符串左侧空格字符被删除。【示例3.12】使用LTRIM函数删除字符串左边的空格,输入语句如下:

mysql> SELECT '(  book  )',CONCAT('(',LTRIM('  book  '),')');
+------------+-----------------------------------+
| (  book  ) | CONCAT('(',LTRIM('  book  '),')') |
+------------+-----------------------------------+
| (  book  ) | (book  )                          |
+------------+-----------------------------------+
1 row in set (0.00 sec)

RTRIM(s) 返回字符串 s,字符串右侧空格字符被删除。【示例3.13】使用RTRIM函数删除字符串右边的空格,输入语句如下:

mysql> SELECT '(  book  )',CONCAT('(', RTRIM ('  book  '),')');
+------------+-------------------------------------+
| (  book  ) | CONCAT('(', RTRIM ('  book  '),')') |
+------------+-------------------------------------+
| (  book  ) | (  book)                            |
+------------+-------------------------------------+
1 row in set (0.00 sec)

TRIM(s) 删除字符串 s 左右两侧的空格。【示例3.14】使用TRIM函数删除字符串两侧的空格,使用语句如下:

mysql> SELECT '(  book  )',CONCAT('(', TRIM('  book  '),')');
+------------+-----------------------------------+
| (  book  ) | CONCAT('(', TRIM('  book  '),')') |
+------------+-----------------------------------+
| (  book  ) | (book)                            |
+------------+-----------------------------------+
1 row in set (0.00 sec)

3.8 删除指定字符串的函数TRIM(s1 FROM s)

TRIM(s1 FROM s) 删除字符串 s 中两端所有的子字符串 s1s1 为可选项,在未指定的情况下,会删除空格。【示例3.15】使用TRIM(s1 FROM s)函数删除字符串两端指定的字符,输入语句如下:

mysql> SELECT TRIM('xy' FROM 'xyxboxyokxxyxy') ;
+----------------------------------+
| TRIM('xy' FROM 'xyxboxyokxxyxy') |
+----------------------------------+
| xboxyokx                         |
+----------------------------------+
1 row in set (0.00 sec)

3.9 重复生成字符串的函数REPEAT(s,n)

REPEAT(s,n) 返回一个由重复的字符串 s 组成的字符串,字符串 s 的数目等于 n。若 n<=0,则返回一个空字符串。若 snNULL,则返回 NULL【示例3.16】使用REPEAT函数重复生成相同的字符串,输入语句如下:

mysql> SELECT REPEAT('mysql', 3);
+--------------------+
| REPEAT('mysql', 3) |
+--------------------+
| mysqlmysqlmysql    |
+--------------------+
1 row in set (0.00 sec)

3.10 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)

SPACE(n) 返回一个由 n 个空格组成的字符串。【示例3.17】使用SPACE函数生成由空格组成的字符串,输入语句如下:

mysql> SELECT CONCAT('(', SPACE(6), ')' );
+-----------------------------+
| CONCAT('(', SPACE(6), ')' ) |
+-----------------------------+
| (      )                    |
+-----------------------------+
1 row in set (0.00 sec)

REPLACE(s,s1,s2) 使用字符串 s2 替代字符串 s 中所有的字符串 s1【示例3.18】使用REPLACE函数进行字符串替代操作,输入语句如下:

mysql> SELECT REPLACE('xxx.mysql.com', 'x', 'w');
+------------------------------------+
| REPLACE('xxx.mysql.com', 'x', 'w') |
+------------------------------------+
| www.mysql.com                      |
+------------------------------------+
1 row in set (0.00 sec)

3.11 比较字符串大小的函数STRCMP(s1,s2)

STRCMP(s1,s2) 比较字符串 s1s2 的大小。若 s1s2 所有的字符均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1;其他情况返回1。【示例3.19】使用STRCMP函数比较字符串大小,输入语句如下:

mysql> SELECT STRCMP('txt', 'txt2'),STRCMP('txt2', 'txt'), STRCMP('txt', 'txt');
+-----------------------+-----------------------+----------------------+
| STRCMP('txt', 'txt2') | STRCMP('txt2', 'txt') | STRCMP('txt', 'txt') |
+-----------------------+-----------------------+----------------------+
|                    -1 |                     1 |                    0 |
+-----------------------+-----------------------+----------------------+
1 row in set (0.00 sec)

3.12 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)

SUBSTRING(s,n,len) 带有 len 参数的格式,从字符串 s 返回一个长度与 len 字符相同的子字符串,起始于位置 n。也可能对 n 使用一个负值,如果是这种情况,则子字符串的位置起始于字符串结尾的 n 字符,即倒数第 n 个字符,而不是字符串的开头位置。【示例3.20】使用SUBSTRING函数获取指定位置处的子字符串,输入语句如下:

mysql> SELECT SUBSTRING('breakfast',5) AS col1, SUBSTRING('breakfast',5,3) AS col2,SUBSTRING('lunch', -3) AS col3,
SUBSTRING('lunch', -5, 3) AS col4;
+-------+------+------+------+
| col1  | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa  | nch  | lun  |
+-------+------+------+------+
1 row in set (0.00 sec)

MID(s,n,len) 函数与 SUBSTRING(s,n,len) 的作用相同。【示例3.21】使用MID函数获取指定位置处的子字符串,输入语句如下:

mysql> SELECT MID('breakfast',5) as col1, MID('breakfast',5,3) as col2,MID('lunch', -3) as col3,MID('lunch', -5, 3) as col4;
+-------+------+------+------+
| col1  | col2 | col3 | col4 |
+-------+------+------+------+
| kfast | kfa  | nch  | lun  |
+-------+------+------+------+
1 row in set (0.00 sec)

可以看到 MIDSUBSTRING 的处理结果是一样的。

提示:如果对len使用的是一个小于1的值,则结果始终为空字符串。

3.13 匹配子串开始位置的函数

LOCATE(str1,str)POSITION(str1 IN str)INSTR(str, str1) 3个函数的作用相同,返回子字符串 str1 在字符串 str 中的开始位置。【示例3.22】使用LOCATE、POSITION、INSTR函数,查找字符串中指定子字符串的开始位置,输入语句如下:

mysql> SELECT LOCATE('ball','football'),POSITION('ball'IN 'football'),INSTR ('football', 'ball');
+---------------------------+-------------------------------+----------------------------+
| LOCATE('ball','football') | POSITION('ball'IN 'football') | INSTR ('football', 'ball') |
+---------------------------+-------------------------------+----------------------------+
|                         5 |                             5 |                          5 |
+---------------------------+-------------------------------+----------------------------+
1 row in set (0.00 sec)

3.14 字符串逆序的函数REVERSE(s)

REVERSE(s) 函数将字符串 s 反转,返回的字符串的顺序和 s 字符串顺序相反。【示例3.23】使用REVERSE函数反转字符串,输入语句如下:

mysql> SELECT REVERSE('abc');
+----------------+
| REVERSE('abc') |
+----------------+
| cba            |
+----------------+
1 row in set (0.00 sec)

3.15 返回指定位置的字符串的函数

对于 ELT(N,字符串1,字符串2,字符串3,...,字符串N) 函数,若 N=1,则返回值为字符串1;若 N=2,则返回值为字符串2;以此类推;若N小于1或大于参数的个数,则返回值为 NULL【示例3.24】使用ELT函数返回指定位置字符串,输入语句如下:

mysql> SELECT ELT(3,'1st','2nd','3rd'), ELT(3,'net','os');
+--------------------------+-------------------+
| ELT(3,'1st','2nd','3rd') | ELT(3,'net','os') |
+--------------------------+-------------------+
| 3rd                      | NULL              |
+--------------------------+-------------------+
1 row in set (0.00 sec)

3.16 返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)

FIELD(s,s1,s2,…,sn) 函数返回字符串 s 在列表 s1,s2,…,sn 中第一次出现的位置,在找不到 s 的情况下,返回值为0。如果 s 为NULL,则返回值为0,原因是NULL不能与任何值进行同等比较。【示例3.25】使用FIELD函数返回指定字符串第一次出现的位置,输入语句如下:

mysql> SELECT FIELD('Hi', 'hihi', 'Hey', 'Hi', 'bas') as col1, FIELD('Hi', 'Hey', 'Lo', 'Hilo', 'foo') as col2;
+------+------+
| col1 | col2 |
+------+------+
|    3 |    0 |
+------+------+
1 row in set (0.00 sec)

3.17 返回子串位置的函数FIND_IN_SET(s1,s2)

FIND_IN_SET(s1,s2) 函数返回字符串 s1 在字符串列表 s2 中出现的位置,字符串列表是一个由多个逗号 “,” 分开的字符串组成的列表。如果 s1 不在 s2 中或 s2 为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号 “,” 的情况下,将无法正常运行。【示例3.26】使用FIND_IN_SET()函数返回子字符串在字符串列表中的位置,输入语句如下:

mysql> SELECT FIND_IN_SET('Hi','hihi,Hey,Hi,bas');
+-------------------------------------+
| FIND_IN_SET('Hi','hihi,Hey,Hi,bas') |
+-------------------------------------+
|                                   3 |
+-------------------------------------+
1 row in set (0.00 sec)

3.18 选取字符串的函数MAKE_SET(x,s1,s2,…,sn)

MAKE_SET(x,s1,s2,…,sn) 函数按 x 的二进制数从 s1,s2,…,sn 中选取字符串。例如,5的二进制是0101,这个二进制从右往左的第1位和第3位是1,所以选取 s1s3s1,s2,...,sn 中的 NULL 值不会被添加到结果中。【示例3.27】使用MAKE_SET函数根据二进制位选取指定字符串,输入语句如下:

mysql> SELECT  MAKE_SET(1,'a','b','c') as col1, MAKE_SET(1 | 4,'hello','nice','world') as col2,
MAKE_SET(1 | 4,'hello','nice',NULL,'world') as col3, MAKE_SET(0,'a','b','c') as col4;
+------+-------------+-------+------+
| col1 | col2        | col3  | col4 |
+------+-------------+-------+------+
| a    | hello,world | hello |      |
+------+-------------+-------+------+
1 row in set (0.00 sec)

四、日期和时间函数

日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用 DATE 类型的参数外,也可以使用 DATETIME 或者 TIMESTAMP 类型的参数,但会忽略这些值的时间部分。相同地,以 TIME 类型值为参数的函数,可以接受 TIMESTAMP 类型的参数,但会忽略日期部分,许多日期函数可以同时接受数字和字符串类型的两种参数。本小节将介绍各种日期和时间函数的作用和用法。

4.1 获取当前日期的函数和获取当前时间的函数

CURDATE()CURRENT_DATE() 函数的作用相同,将当前日期按照 YYYY-MM-DDYYYYMMDD 格式的值返回,具体格式根据函数用于字符串或是数字的语境而定。【示例4.1】使用日期函数获取系统当前日期,输入语句如下:

# CURDATE() + 0 将当前日期值转换为数值型
mysql> SELECT CURDATE(),CURRENT_DATE(), CURDATE() + 0;
+------------+----------------+---------------+
| CURDATE()  | CURRENT_DATE() | CURDATE() + 0 |
+------------+----------------+---------------+
| 2023-01-15 | 2023-01-15     |      20230115 |
+------------+----------------+---------------+
1 row in set (0.00 sec)

CURTIME()CURRENT_TIME() 函数的作用相同,将当前时间以 HH:MM:SSHHMMSS 的格式返回,具体格式根据函数用于字符串或是数字的语境而定。【示例4.2】使用时间函数获取系统当前时间,输入语句如下:

#CURTIME () + 0将当前时间值转换为数值型
mysql> SELECT CURTIME(),CURRENT_TIME(),CURTIME() + 0;
+-----------+----------------+---------------+
| CURTIME() | CURRENT_TIME() | CURTIME() + 0 |
+-----------+----------------+---------------+
| 12:47:13  | 12:47:13       |        124713 |
+-----------+----------------+---------------+
1 row in set (0.00 sec)

4.2 获取当前日期和时间的函数

CURRENT_TIMESTAMP()LOCALTIME()NOW()SYSDATE() 4个函数的作用相同,均返回当前日期和时间值,格式为 YYYY-MM-DD HH:MM:SSYYYYMMDDHHMMSS,具体格式根据函数用于字符串或数字的语境而定。【示例4.3】使用日期时间函数获取当前系统日期和时间,输入语句如下:可以看到,4个函数返回的结果是相同的。

mysql> SELECT CURRENT_TIMESTAMP(),LOCALTIME(),NOW(),SYSDATE();
+---------------------+---------------------+---------------------+---------------------+
| CURRENT_TIMESTAMP() | LOCALTIME()         | NOW()               | SYSDATE()           |
+---------------------+---------------------+---------------------+---------------------+
| 2023-01-15 12:51:59 | 2023-01-15 12:51:59 | 2023-01-15 12:51:59 | 2023-01-15 12:51:59 |
+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)

4.3 UNIX时间戳函数

UNIX_TIMESTAMP(date) 函数若无参数调用,则返回一个 UNIX 时间戳(即 1970-01-01 00:00:00 GMT之后的秒数)作为无符号整数。其中,GMT(Greenwich Mean Time)为格林尼治标准时间。若用 date 来调用 UNIX_TIMESTAMP(),它会将参数值以 1970-01-01 00:00:00(GMT)后的秒数的形式返回。date 可以是一个 DATE字符串、DATETIME字符串、TIMESTAMP 或一个当地时间的 YYMMDDYYYYMMDD 格式的数字。【示例4.4】使用UNIX_TIMESTAMP函数返回UNIX格式的时间戳,输入语句如下:

mysql> SELECT UNIX_TIMESTAMP(), UNIX_TIMESTAMP(NOW()), NOW();
+------------------+-----------------------+---------------------+
| UNIX_TIMESTAMP() | UNIX_TIMESTAMP(NOW()) | NOW()               |
+------------------+-----------------------+---------------------+
|       1673758724 |            1673758724 | 2023-01-15 12:58:44 |
+------------------+-----------------------+---------------------+
1 row in set (0.00 sec)
#FROM_UNIXTIME(date)函数把UNIX时间戳转换为普通格式的时间,与UNIX_TIMESTAMP(date)函数互为反函数。
mysql> SELECT FROM_UNIXTIME('1673758724');
+-----------------------------+
| FROM_UNIXTIME('1673758724') |
+-----------------------------+
| 2023-01-15 12:58:44.000000  |
+-----------------------------+
1 row in set (0.00 sec)

4.4 返回UTC日期的函数和返回UTC时间的函数

UTC_DATE() 函数返回当前 UTC(世界标准时间) 日期值,其格式为 YYYY-MM-DDYYYYMMDD,具体格式取决于函数是否用在字符串或数字语境中。【示例4.5】使用UTC_DATE()函数返回当前UTC日期值,输入语句如下:

mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
+------------+----------------+
| UTC_DATE() | UTC_DATE() + 0 |
+------------+----------------+
| 2023-01-15 |       20230115 |
+------------+----------------+
1 row in set (0.00 sec)
#UTC_TIME()返回当前UTC时间值,其格式为HH:MM:SS或HHMMSS,具体格式取决于函数是否用在字符串或数字语境中
#使用UTC_TIME()函数返回当前UTC时间值,输入语句如下:
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
+------------+----------------+
| UTC_TIME() | UTC_TIME() + 0 |
+------------+----------------+
| 05:04:42   |          50442 |
+------------+----------------+
1 row in set (0.00 sec)

4.5 获取月份的函数MONTH(date)和MONTHNAME(date)

MONTH(date) 函数返回 date 对应的月份,范围值为 1~12【示例4.6】使用MONTH()函数返回指定日期中的月份,输入语句如下:

mysql> SELECT MONTH('2023-01-15');
+---------------------+
| MONTH('2023-01-15') |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

【示例4.7】使用MONTHNAME()函数返回指定日期中月份的名称,输入语句如下:

mysql> SELECT MONTHNAME('2023-01-15');
+-------------------------+
| MONTHNAME('2023-01-15') |
+-------------------------+
| January                 |
+-------------------------+
1 row in set (0.00 sec)

4.6 获取星期的函数DAYNAME(d)、DAYOFWEEK(d)和WEEKDAY(d)

DAYNAME(d) 函数返回参数 d 对应的工作日的英文名称,例如 Sunday、Monday 等。【示例4.8】使用DAYNAME()函数返回指定日期的工作日名称,输入语句如下:

mysql> SELECT DAYNAME('2023-01-15');
+-----------------------+
| DAYNAME('2023-01-15') |
+-----------------------+
| Sunday                |
+-----------------------+
1 row in set (0.00 sec)

DAYOFWEEK(d) 函数返回参数 d 对应的一周中的索引(位置,1表示周日,2表示周一,…,7表示周六)。 【示例4.9】使用DAYOFWEEK()函数返回日期对应的周索引,输入语句如下:

mysql> SELECT DAYOFWEEK('2023-01-15');
+-------------------------+
| DAYOFWEEK('2023-01-15') |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

WEEKDAY(d) 返回参数 d 对应的工作日索引:0表示周一,1表示周二,…,6表示周日。 【示例4.10】使用WEEKDAY()函数返回日期对应的工作日索引,输入语句如下:

#WEEKDAY()和DAYOFWEEK()函数都是返回指定日期在某一周内的位置,只是索引编号不同。
mysql> SELECT WEEKDAY('2023-01-15 13:16:00'), WEEKDAY('2023-01-15');
+--------------------------------+-----------------------+
| WEEKDAY('2023-01-15 13:16:00') | WEEKDAY('2023-01-15') |
+--------------------------------+-----------------------+
|                              6 |                     6 |
+--------------------------------+-----------------------+
1 row in set (0.00 sec)

4.7 获取星期数的函数WEEK(d)和WEEKOFYEAR(d)

WEEK(d) 计算日期 d 是一年中的第几周。WEEK() 的双参数形式允许指定该星期是否起始于周日或周一,以及返回值的范围是否为 0~531~53。若 Mode 参数被省略,则使用 default_week_format 系统自变量的值,可参考下表:
在这里插入图片描述
【示例4.11】使用WEEK()函数查询指定日期是一年中的第几周,输入语句如下:

mysql> SELECT WEEK('2018-02-20'),WEEK('2018-02-20',0), WEEK('2018-02-20',1);
+--------------------+----------------------+----------------------+
| WEEK('2018-02-20') | WEEK('2018-02-20',0) | WEEK('2018-02-20',1) |
+--------------------+----------------------+----------------------+
|                  7 |                    7 |                    8 |
+--------------------+----------------------+----------------------+
1 row in set (0.00 sec)

WEEKOFYEAR(d) 计算某天位于一年中的第几周,范围是 1~53,相当于 WEEK(d,3)【示例4.12】使用WEEKOFYEAR()查询指定日期是一年中的第几周,输入语句如下:

mysql> SELECT WEEK('2018-01-20',3), WEEKOFYEAR('2018-01-20');
+----------------------+--------------------------+
| WEEK('2018-01-20',3) | WEEKOFYEAR('2018-01-20') |
+----------------------+--------------------------+
|                    3 |                        3 |
+----------------------+--------------------------+
1 row in set (0.00 sec)

4.8 获取天数的函数DAYOFYEAR(d)和DAYOFMONTH(d)

DAYOFYEAR(d) 函数返回日期d是一年中的第几天,范围是 1~366【示例4.13】使用DAYOFYEAR()函数返回指定日期在一年中的位置,输入语句如下:

mysql> SELECT DAYOFYEAR('2018-02-20');
+-------------------------+
| DAYOFYEAR('2018-02-20') |
+-------------------------+
|                      51 |
+-------------------------+
1 row in set (0.00 sec)

DAYOFMONTH(d) 函数返回日期d,是一个月中的第几天,范围是 1~31【示例4.14】使用DAYOFMONTH()函数返回指定日期在一个月中的位置,输入语句如下:

mysql> SELECT DAYOFMONTH('2023-01-15');
+--------------------------+
| DAYOFMONTH('2023-01-15') |
+--------------------------+
|                       15 |
+--------------------------+
1 row in set (0.00 sec)

4.9 获取年份、季度、小时、分钟和秒钟的函数

YEAR(date) 返回日期 date 对应的年份,范围是 1970~2069QUARTER(date) 返回日期 date 对应的一年中的季度值,范围是 1~4MINUTE(time) 返回 time 对应的分钟数,范围是 0~59SECOND(time) 返回 time 对应的秒数,范围是 0~59。SQL 示例如下:

mysql> SELECT YEAR('18-02-03'),YEAR('96-02-03');
+------------------+------------------+
| YEAR('18-02-03') | YEAR('96-02-03') |
+------------------+------------------+
|             2018 |             1996 |
+------------------+------------------+
1 row in set (0.00 sec)

mysql> SELECT QUARTER('18-04-01');
+---------------------+
| QUARTER('18-04-01') |
+---------------------+
|                   2 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT MINUTE('18-02-03 10:10:03');
+-----------------------------+
| MINUTE('18-02-03 10:10:03') |
+-----------------------------+
|                          10 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> SELECT SECOND('10:05:03');
+--------------------+
| SECOND('10:05:03') |
+--------------------+
|                  3 |
+--------------------+
1 row in set (0.00 sec)

4.10 获取日期的指定值的函数EXTRACT(type FROM date)

EXTRACT(type FROM date) 函数所使用的时间间隔类型说明符与 DATE_ADD()DATE_SUB() 使用的相同,但它从日期中提取一部分,而不是执行日期运算。

mysql> SELECT EXTRACT(YEAR FROM '2018-07-02') AS col1, EXTRACT(YEAR_MONTH FROM '2018-07-12 01:02:03') AS col2, 
EXTRACT(DAY_MINUTE FROM '2018-07-12 01:02:03') AS col3;
+------+--------+--------+
| col1 | col2   | col3   |
+------+--------+--------+
| 2018 | 201807 | 120102 |
+------+--------+--------+
1 row in set (0.00 sec)

4.11 时间和秒钟转换的函数

TIME_TO_SEC(time) 返回已转化为秒的 time 参数。转换公式为:小时×3600+分钟×60+秒

mysql> SELECT TIME_TO_SEC('23:23:00');
+-------------------------+
| TIME_TO_SEC('23:23:00') |
+-------------------------+
|                   84180 |
+-------------------------+
1 row in set (0.00 sec)

SEC_TO_TIME(seconds) 函数返回被转化为小时、分钟和秒数的 seconds 参数值,其格式为 HH:MM:SSHHMMSS,具体格式根据该函数用在字符串或数字的语境而定。

mysql> SELECT SEC_TO_TIME(2345),SEC_TO_TIME(2345)+0, TIME_TO_SEC('23:23:00'), SEC_TO_TIME(84180);
+-------------------+---------------------+-------------------------+--------------------+
| SEC_TO_TIME(2345) | SEC_TO_TIME(2345)+0 | TIME_TO_SEC('23:23:00') | SEC_TO_TIME(84180) |
+-------------------+---------------------+-------------------------+--------------------+
| 00:39:05          |                3905 |                   84180 | 23:23:00           |
+-------------------+---------------------+-------------------------+--------------------+
1 row in set (0.00 sec)

4.12 计算日期和时间的函数

计算日期和时间的函数有 DATE_ADD()ADDDATE()DATE_SUB()SUBDATE()ADDTIME()SUBTIME()DATE_DIFF()。在 DATE_ADD(date,INTERVAL expr type)DATE_SUB(date,INTERVAL expr type) 中,参数 date 是一个 DATETIMEDATE 值,用来指定起始时间。expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。对于负值的时间间隔,expr 以一个负号 - 开头。type 为关键词,指示了表达式被解释的方式。下表显示了 typeexpr 参数的关系:
请添加图片描述
SQL 语句示例如下:

mysql> SELECT DATE_ADD('2010-12-31 23:59:59', INTERVAL 1 SECOND) AS col1, 
ADDDATE('2010-12-3123:59:59', INTERVAL 1 SECOND) AS col2, DATE_ADD('2010-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND)AS col3;
+---------------------+------+---------------------+
| col1                | col2 | col3                |
+---------------------+------+---------------------+
| 2011-01-01 00:00:00 | NULL | 2011-01-01 00:01:00 |
+---------------------+------+---------------------+
1 row in set, 1 warning (0.00 sec)

DATE_SUB(date,INTERVAL expr type) 或者 SUBDATE(date,INTERVAL expr type) 两个函数的作用相同,执行日期的减运算。使用 DATE_SUBSUBDATE 函数执行日期的减操作,输入语句如下:

#DATE_ADD和DATE_SUB在指定修改的时间段时,也可以指定负值,负值代表相减,即返回以前的日期和时间。
mysql> SELECT DATE_SUB('2011-01-02', INTERVAL 31 DAY) AS col1, 
SUBDATE('2011-01-02', INTERVAL     31 DAY) AS col2, DATE_SUB('2011-01-01 00:01:00',INTERVAL '0 0:1:1' DAY_SECOND) AS col3;
+------------+------------+---------------------+
| col1       | col2       | col3                |
+------------+------------+---------------------+
| 2010-12-02 | 2010-12-02 | 2010-12-31 23:59:59 |
+------------+------------+---------------------+
1 row in set (0.00 sec)

ADDTIME(date,expr) 函数将 expr 值添加到 date,并返回修改后的值,date 是一个日期或者日期时间表达式,而 expr 是一个时间表达式。使用 ADDTIME 进行时间的加操作,输入语句如下:

mysql> SELECT ADDTIME('2000-12-31 23:59:59','1:1:1'), ADDTIME('02:02:02', '02:00:00');
+----------------------------------------+---------------------------------+
| ADDTIME('2000-12-31 23:59:59','1:1:1') | ADDTIME('02:02:02', '02:00:00') |
+----------------------------------------+---------------------------------+
| 2001-01-01 01:01:00                    | 04:02:02                        |
+----------------------------------------+---------------------------------+
1 row in set (0.00 sec)

SUBTIME(date,expr) 函数将 date 减去 expr 值,并返回修改后的值。其中,date 是一个日期或者日期时间表达式,而 expr 是一个时间表达式。使用 SUBTIME() 函数执行时间的减操作,输入语句如下:

mysql> SELECT SUBTIME('2000-12-31 23:59:59','1:1:1'), SUBTIME('02:02:02','02:00:00');
+----------------------------------------+--------------------------------+
| SUBTIME('2000-12-31 23:59:59','1:1:1') | SUBTIME('02:02:02','02:00:00') |
+----------------------------------------+--------------------------------+
| 2000-12-31 22:58:58                    | 00:02:02                       |
+----------------------------------------+--------------------------------+
1 row in set (0.00 sec)

DATEDIFF(date1,date2) 函数返回起始时间 date1 和结束时间 date2 之间的天数。date1date2 为日期或日期时间表达式,计算中只用到这些值的日期部分。使用 DATEDIFF() 函数计算两个日期之间的间隔天数,输入语句如下:

mysql> SELECT DATEDIFF('2010-12-31 23:59:59','2010-12-30') AS col1, DATEDIFF('2010-11-30 23:59:59','2010-12-31') AS col2;
+------+------+
| col1 | col2 |
+------+------+
|    1 |  -31 |
+------+------+
1 row in set (0.00 sec)

4.13 将日期和时间格式化的函数

DATE_FORMAT(date,format) 根据 format 指定的格式显示 date 值。主要 format 格式如下表所示:
请添加图片描述
请添加图片描述
使用 DATE_FORMAT() 函数格式化输出日期和时间值,输入语句如下:

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y') AS col1, 
DATE_FORMAT('1997-10-04 22:23:00','%D %y %a %d %m %b %j') AS col2;
+-----------------------+--------------------------+
| col1                  | col2                     |
+-----------------------+--------------------------+
| Saturday October 1997 | 4th 97 Sat 04 10 Oct 277 |
+-----------------------+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s') AS col3, DATE_FORMAT('1999-01-01', '%X %V') AS col4;
+----------+---------+
| col3     | col4    |
+----------+---------+
| 22:23:00 | 1998 52 |
+----------+---------+
1 row in set (0.00 sec)

TIME_FORMAT(time,format) 根据表达式 format 的要求显示时间 time。表达式 format 指定了显示的格式。因为 TIME_FORMAT(time,format) 只处理时间,所以 format 只使用时间格式。使用 TIME_FORMAT() 函数格式化输入的时间值,输入语句如下:

mysql> SELECT TIME_FORMAT('16:00:00', '%H %k %h %I %l');
+-------------------------------------------+
| TIME_FORMAT('16:00:00', '%H %k %h %I %l') |
+-------------------------------------------+
| 16 16 04 04 4                             |
+-------------------------------------------+
1 row in set (0.00 sec)

GET_FORMAT(val_type, format_type) 返回日期时间字符串的显示格式,val_type 表示日期数据类型,包括 DATE、DATETIME和TIME;format_type 表示格式化显示类型,包括 EUR、INTERVAL、ISO、JIS、USA。GET_FORMAT 根据两个值类型组合返回的字符串显示格式如下表所示:
请添加图片描述
请添加图片描述
使用 GET_FORMAT() 函数显示不同格式化类型下的格式字符串,输入语句如下:

mysql> SELECT GET_FORMAT(DATE,'EUR'), GET_FORMAT(DATE,'USA');
+------------------------+------------------------+
| GET_FORMAT(DATE,'EUR') | GET_FORMAT(DATE,'USA') |
+------------------------+------------------------+
| %d.%m.%Y               | %m.%d.%Y               |
+------------------------+------------------------+
1 row in set (0.00 sec)

DATE_FORMAT() 函数中,使用 GET_FORMAT 函数返回的格式字符串来显示指定的日期值,输入语句如下:

mysql> SELECT DATE_FORMAT('2000-10-05 22:23:00', GET_FORMAT(DATE,'USA') );
+-------------------------------------------------------------+
| DATE_FORMAT('2000-10-05 22:23:00', GET_FORMAT(DATE,'USA') ) |
+-------------------------------------------------------------+
| 10.05.2000                                                  |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amo Xiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值