文章目录
- 一、函数
- 二、数学函数
- 三、字符串函数
- 3.1 计算字符串字符数的函数和字符串长度的函数
- 3.2 合并字符串函数CONCAT(s1,s2,…)、CONCAT_WS(x,s1,s2,…)
- 3.3 替换字符串的函数INSERT(s1,x,len,s2)
- 3.4 字母大小写转换函数
- 3.5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
- 3.6 填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)
- 3.7 删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
- 3.8 删除指定字符串的函数TRIM(s1 FROM s)
- 3.9 重复生成字符串的函数REPEAT(s,n)
- 3.10 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)
- 3.11 比较字符串大小的函数STRCMP(s1,s2)
- 3.12 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)
- 3.13 匹配子串开始位置的函数
- 3.14 字符串逆序的函数REVERSE(s)
- 3.15 返回指定位置的字符串的函数
- 3.16 返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)
- 3.17 返回子串位置的函数FIND_IN_SET(s1,s2)
- 3.18 选取字符串的函数MAKE_SET(x,s1,s2,…,sn)
- 四、日期和时间函数
- 4.1 获取当前日期的函数和获取当前时间的函数
- 4.2 获取当前日期和时间的函数
- 4.3 UNIX时间戳函数
- 4.4 返回UTC日期的函数和返回UTC时间的函数
- 4.5 获取月份的函数MONTH(date)和MONTHNAME(date)
- 4.6 获取星期的函数DAYNAME(d)、DAYOFWEEK(d)和WEEKDAY(d)
- 4.7 获取星期数的函数WEEK(d)和WEEKOFYEAR(d)
- 4.8 获取天数的函数DAYOFYEAR(d)和DAYOFMONTH(d)
- 4.9 获取年份、季度、小时、分钟和秒钟的函数
- 4.10 获取日期的指定值的函数EXTRACT(type FROM date)
- 4.11 时间和秒钟转换的函数
- 4.12 计算日期和时间的函数
- 4.13 将日期和时间格式化的函数
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)
返回 x
被 y
除后的余数,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)
函数返回 x
的 y
次方(乘方) 的结果值。 【示例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
不在 -1
到 1
的范围之内,则返回 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)
函数将字符串 s1
中 x
位置开始、长度为 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
中两端所有的子字符串 s1
。s1
为可选项,在未指定的情况下,会删除空格。【示例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
,则返回一个空字符串。若 s
或 n
为 NULL
,则返回 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)
比较字符串 s1
与 s2
的大小。若 s1
与 s2
所有的字符均相同,则返回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)
可以看到 MID
和 SUBSTRING
的处理结果是一样的。
提示:如果对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,所以选取 s1
和 s3
。s1,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-DD
或 YYYYMMDD
格式的值返回,具体格式根据函数用于字符串或是数字的语境而定。【示例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:SS
或 HHMMSS
的格式返回,具体格式根据函数用于字符串或是数字的语境而定。【示例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:SS
或 YYYYMMDDHHMMSS
,具体格式根据函数用于字符串或数字的语境而定。【示例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
或一个当地时间的 YYMMDD
或 YYYYMMDD
格式的数字。【示例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-DD
或 YYYYMMDD
,具体格式取决于函数是否用在字符串或数字语境中。【示例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~53
或 1~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~2069
。QUARTER(date)
返回日期 date
对应的一年中的季度值,范围是 1~4
。MINUTE(time)
返回 time
对应的分钟数,范围是 0~59
。SECOND(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:SS
或 HHMMSS
,具体格式根据该函数用在字符串或数字的语境而定。
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
是一个 DATETIME
或 DATE
值,用来指定起始时间。expr
是一个表达式,用来指定从起始日期添加或减去的时间间隔值。对于负值的时间间隔,expr
以一个负号 -
开头。type
为关键词,指示了表达式被解释的方式。下表显示了 type
和 expr
参数的关系:
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_SUB
和 SUBDATE
函数执行日期的减操作,输入语句如下:
#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
之间的天数。date1
和 date2
为日期或日期时间表达式,计算中只用到这些值的日期部分。使用 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)
至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!
好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请点赞
、评论
、收藏
一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注
我哦!