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

news2024/12/27 12:44:21

文章目录

  • 一、函数
    • 1.1 函数简介
    • 1.2 不同DBMS函数的差异
  • 二、数学函数
    • 2.1 绝对值函数ABS(x)和返回圆周率的函数PI()
    • 2.2 平方根函数SQRT(x)和求余函数MOD(x,y)
    • 2.3 获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)
    • 2.4 获取随机数的函数RAND()和RAND(x)
    • 2.5 函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)
    • 2.6 符号函数SIGN(x)
    • 2.7 幂运算函数POW(x,y)、POWER(x,y)和EXP(x)
    • 2.8 对数运算函数LOG(x)和LOG10(x)
    • 2.9 其他数学函数(不怎么常用)
  • 三、字符串函数
    • 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) 返回 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) 返回字符串 s1,其子字符串起始于 x 位置和被字符串 s2 取代的 len 字符。如果 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)

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


在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keytool 工具介绍

使用JDK自带的 keytool 工具&#xff1a; 简介 keytool 命令是一个密钥和证书管理的工具。它允许用户使用数字签名管理自己的公钥/私钥对和相关证书&#xff0c;用于自我身份验证(向其他用户和服务验证自己)或数据完整性和身份验证服务。keytool 命令还允许用户缓存通信对等体…

【七牛云 后端】笔试面

一、选择、填空知识点整理 1. fork() 函数 fork() 函数通过系统调用创建一个与原来进程相同的进程&#xff08;如果初始参数或者传入的变量不同&#xff0c;两个进程也可以做不同的事&#xff09; 示例 —— #include <stdio.h> int main() {for(int i0; i<2; i){…

centos7 安装git

一、查看是否安装过git git --version若出现以上版本号&#xff0c;则代表已经安装了git&#xff0c;不需要再次安装了&#xff0c;git安装&#xff0c;分为用yum安装和下载git源码编译安装&#xff0c;以下两种方法&#xff1a; 二、使用yum安装git yum -y install git安装…

磨金石教育摄影技能干货分享|如何在纪实摄影中体现艺术内涵

纪实摄影往往是摄影师在生活中或者旅行中随手拍下的&#xff0c;记录人们平常的瞬间。这类摄影往往强调真实性&#xff0c;在技巧上不会过多的追求。但有时候摄影师为了体现照片中更多的内涵&#xff0c;或者个人的情感思想&#xff0c;会运用一些摄影技巧来表现。下面就让我们…

动态内存与动态内存函数详解

文章目录前言一、动态内存函数的介绍1.malloc函数2.calloc3.realloc4.free二、两种常见的内存申请方法1.返回指针2.传二级指针三.常见的动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分…

6. 描述性统计函数:summary 、Fivenum、describe、describeBy、stat.desc、 Aggregate、summaryBy

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…

ESP32设备驱动-ADXL345三轴加速计驱动

ADXL345三轴加速计驱动 文章目录 ADXL345三轴加速计驱动1、ADXL345介绍2、硬件准备3、软件准备4、驱动实现1、ADXL345介绍 ADXL345 是一款小型、薄型、低功耗、3 轴加速度计,具有高达 16g 的高分辨率(13 位)测量值。数字输出数据采用 16 位二进制补码格式,可通过 SPI(3 线…

C进阶:动态内存函数 malloc calloc realloc free及常见动态内存开辟错误

本文主要讲解动态内存开辟的有关知识。 目录 一.malloc 与 free 1.malloc 2.free 3.实例&#xff1a; 二.calloc 三.realloc 四.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放一块动态…

springboot 构建多模块项目

新建 spring initializr 父项目 Spring 官方提供了 Spring Initializr 来引导大家快速构建一个应用项目。在此不细说。 idea 创建 1、 new – project 注意jdk版本 和 勾选 default,然后next 2、 填写项目信息 3、选择项目组成部分,也可后期加上 4、选择项目位置 --选…

Docker入门:介绍Docker的常用命令、镜像的加载原理、Dockerfile打包、Docker网络、Docker Compose容器编排+监控

Docker入门 1&#xff09;从面向对象角度来看&#xff0c;Docker利用容器&#xff08;Container&#xff09;独立运行一个或一组应用&#xff0c;应用程序或服务运行在容器里面&#xff0c;容器就类似于一个虚拟化的运行环境&#xff0c;容器是用镜像创建出来的运行实例。就像是…

区块链笔记4--BTC实现

1 UTXO &#xff1a;区块链是一个去中心化的账本&#xff0c;比特币采用了 基于交易的账本模式。然而&#xff0c;系统中并无显示记录账户包含BTC数&#xff0c;实际上其需要通过交易记录进行推算。在比特币系统中&#xff0c;全节点需要维护一个名为 UTXO(UnspentTransaction …

Java抽象类:案例、特点、模板方法模式

一.抽象类的案例 案例&#xff1a;加油站支付卡 系统需求&#xff1a; 某加油站推出了2种支付卡&#xff1a; 1、预存1万元的金卡&#xff0c;后续加油享受8折优惠&#xff1b; 2、预存5千元的银卡&#xff0c;后续加油享受8.5折优惠。 请分别实现2种卡片进入收银系统后的…

记录每日LeetCode 2293.极大极小游戏 Java实现

题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#xff0c;新数组…

分享66个HTMLCSS源码,总有一款适合您

HTML&CSS源码 分享66个HTML&CSS源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1AeVqON7byvt-ngB_U…

位段与枚举

目录 1、位段 1、位段的声明 2、位段的内存分配特点 3、位段的跨平台问题 4、位段的应用 2、枚举 1、枚举类型的定义 2、枚举的优点 3、联合体&#xff08;共用体&#xff09; 1、联合类型的定义 2、联合体的特点即大小计算 1、位段 1、位段的声明 位段的位指的是…

Pr初识01

Pr初识1.关于Pr&#xff1a;2.项目序列3.PR工作界面4.导入素材5.制式与素材管理6.剪辑与工具7.剪辑与工具&#xff08;下&#xff09;8.工具面板与时间轴面板进阶9.关键帧动画10.视频特效11.视频特效&#xff08;下&#xff09;12.音频及结合AU去除噪音13.字幕运用1.关于Pr&…

微信小程序自定义组件、组件的生命周期和组件通信(插槽)

文章目录导航路线自定义组件组建的创建和使用1.创建组件2.引用组件3. 局部引用组件4. 全局引用组件5. 全局引用 VS 局部引用6. 组件和页面的区别样式1.组件样式隔离2. 组件样式隔离的注意点3. 修改组件的样式隔离选项4. styleIsolation 的可选值数据、方法和属性1. data 数据2.…

Arduino UNO驱动 AT24C256 EEPROM存储器模块

Arduino UNO驱动 AT24C256 EEPROM存储器模块 AT24C256模块简介模块引脚定义Arduino UNO与模块接线测试代码实验结果AT24C256模块简介 AT24C256是一个串行EEPROM存储器&#xff0c;提供了256k bit256*1024 bit262144 bit32768 Byte32K Byte大小的存储空间&#xff0c;在芯片内部…

Jmeter做数据构造步骤详解

Jmeter做数据构造步骤详解引入什么是数据构造数据构造的方式数据构造的意义一、JDBC请求执行SQL语句构造数据01 环境准备&#xff1a;添加Jmeter插件02 使用步骤二、HTTP请求调用接口构造数据01 使用步骤完善脚本01 运用函数02 使用逻辑控制器和定时器03 添加响应断言自动判断构…

拒绝平庸,张扬出彩——维乐VELO Angel Revo

在赛场上就要做那个万众瞩目的明星&#xff0c;闪耀自己&#xff0c;让自己的实力让所有人看到&#xff01;作为骑行运动员&#xff0c;骑行配件当然是最能够彰显自我个性的地方&#xff0c;维乐美学系列明星产品Angel Revo正如其名&#xff0c;全面革新&#xff0c;也给了所有…