MySQL常用函数

451 阅读22分钟

1.replace() 替换函数

语法介绍:

REPLACE(string, from_string, new_string)

参数名作用
from原始字符串
from_string要替换的字符串
new_string新的替换字符串

使用示例:

image.png

2.foramt() 数字格式化函数

语法介绍:

FORMAT(number, decimal_places) 将数字格式化为“#,###,###.##”

参数名作用
number目标数字(如果是非数字,处理结果就是0)
decimal_places保留小数位数(四舍五入)

使用示例:

SELECT FORMAT(250500.5634, 2); 
-- 250,500.56

SELECT FORMAT(250500.5634, 0); 
-- 250,501

SELECT FORMAT('哈哈', 3);
-- 0.000

SELECT FORMAT('123456.789', 5);
-- 123,456.78900

3.lenght() char_lenght()系列 计算字符串长度函数

语法介绍:

在MySQL中,LENGTH()和CHAR_LENGTH()是两个用于计算字符串长度的函数(character_length()和char_length()完全相同,一个是全称,一个是简写),它们之间有一些区别。

  • LENGTH()函数:用于计算字符串的字节数(即字符串的实际长度)。对于使用多字节字符集(如UTF-8)存储的字符串,每个字符可能由多个字节组成。因此,LENGTH()函数返回的是字符串中的字节数。
  • CHAR_LENGTH()函数:用于计算字符串的字符数。对于使用多字节字符集存储的字符串,会将每个字符作为一个单位进行计数。它会考虑到字符编码的规则,确保正确计算字符串中的字符数。

总结:

  • 如果你需要计算字符串的字节数,可以使用LENGTH()函数。
  • 如果你需要计算字符串的字符数(即字符的个数),可以使用CHAR_LENGTH()函数。
  • 需要注意的是,对于使用单字节字符集(如ASCII)存储的字符串,LENGTH()和CHAR_LENGTH()函数将返回相同的结果,因为每个字符只占用一个字节。然而,对于使用多字节字符集存储的字符串,它们的结果可能不同

使用示例:

-- 字符集是utf8mb4
SELECT LENGTH('你好世界'); -- 返回12
SELECT CHAR_LENGTH('你好世界'); -- 返回4

4.substring_index() 分隔字符串函数

语法介绍:

用于截取一个字符串中指定分隔符的前部分或后部分
SUBSTRING_INDEX(string, delimiter, count)

参数名作用
string要截取的字符串
delimiter分隔符,用于指定截取的位置
count指定截取的次数,可以是正数或负数。正数表示从左边开始截取,负数表示从右边开始截取。

注意:

  • 当count为正数时,返回从左边开始计算的前count个分隔符之前的部分。
  • 当count为负数时,返回从右边开始计算的前|count|个分隔符之后的部分(即从右边开始截取)

使用示例:

SELECT SUBSTRING_INDEX("www.begtut.com", ".", 2); --  www.begtut

SELECT SUBSTRING_INDEX("www.begtut.com", ".", 1); --  www

SELECT SUBSTRING_INDEX("www.begtut.com", ".", 3); --  www.begtut.com

SELECT SUBSTRING_INDEX("www.begtut.com", ".", -1); --  com

SELECT SUBSTRING_INDEX("www.begtut.com", ".", -2); -- begtut.com


-- 将字符串'a,b,c,d'按逗号分隔,返回前两个分隔符之前的部分,即'a,b'。
SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2); -- 返回'a,b'

-- 将字符串'a,b,c,d'按逗号分隔,返回倒数两个分隔符之后的部分,即'c,d'。
SELECT SUBSTRING_INDEX('a,b,c,d', ',', -2); -- 返回'c,d'

-- 将字符串'www.example.com'按点号分隔,返回第一个点号之前的部分,即'www'。
SELECT SUBSTRING_INDEX('www.example.com', '.', 1); -- 返回'www'

-- 将字符串'www.example.com'按点号分隔,返回最后一个点号之后的部分,即'com'。
SELECT SUBSTRING_INDEX('www.example.com', '.', -1); -- 返回'com'

5.isnull() 过滤null函数

语法介绍:

isnull(var)的作用和var is null的作用一样,都是判断变量值是否为null
isnull(var)只能用在where后面,不能用在select的列中

使用示例:

select * from user where name is null;

select * from user where isnull(name);

6.strcmp() 比较字符串相等函数

语法介绍

STRCMP(str1, str2) 是一个用来比较两个字符串是否相等的函数。该函数接受两个参数,分别是字符串 A 和字符串 B。 STRCMP() 将两个字符串进行比较,并返回一个整数值,该值分为三种情况:

  • 如果字符串 A = 字符串 B,则返回 0;
  • 如果字符串 A < 字符串 B,则返回 -1;
  • 如果字符串 A > 字符串 B,则返回 1。
    注意:
  • STRCMP() 函数对字符串区分大小写;
  • 在比较两个字符串时,先比较第一个字符的 ASCII 码值,如果相等,则以此类推,直到比较出结果为止。

使用示例:

SELECT STRCMP('apple', 'apple'); -- 0

SELECT STRCMP('apple', 'banana'); -- -1

SELECT STRCMP('banana', 'apple'); -- 1

SELECT STRCMP('aaa', 'aaaa'); -- -1

SELECT STRCMP('aba', 'aaaa'); -- 1

7.field()

在MySQL中,FIELD函数用于返回列表中某个字段的索引位置,从1开始。它的使用方式如下:

  • FIELD(value, value1, value2,...)

其中,value是要查找索引位置的值,value1, value2, ...是一个列表,表示要在其中查找索引位置的值。

FIELD函数将会返回value在列表中的位置,如果找不到,则返回0。

FIELD函数还可以与ORDER BY子句结合使用,以实现按照指定的值列表的顺序对查询结果进行排序

8.group_concat分组拼接

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

SELECT
	uid,
	group_concat( DISTINCT CONCAT ( date ( start_time ), ':', tag ) ORDER BY start_time SEPARATOR ';' ) 
FROM
	exam_record
	INNER JOIN examination_info USING ( exam_id ) 
GROUP BY
	uid;

注意:当数据太大,group_concat超出了默认值1024,超过就会截断,group_concat查询出来的数据就会不全。 coalesce()和ifnull()非空判断

9.coalesce()和ifnull()非空判断

coalesce

coalesce(expression_1, expression_2, ...,expression_n)

遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。

示例1

<font style="color:rgb(34, 34, 34);">select coalesce(real_name, “xiaoai”) from table_name</font>

当real_name 为null值的时候,将返回xiaoai,否则将返回real_name的具体值。

示例2

<font style="color:rgb(34, 34, 34);">elect coalesce(real_name ,nick_name,“xiaoai”) from table_name</font>

当real_name不为null,那么无论nick_name是否为null,都将返回real_name的具体值;

当real_name为null,而nick_name,不为null的时候,返回nick_name具体值。

只有当real_name和nick_name都为null的时候,才返回xiaoai。

.ifnull

IFNULL(expression, alt_value)

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

示例

第一个参数为 NULL:

<font style="color:rgb(34, 34, 34);">SELECT IFNULL(NULL, "RUNOOB");</font>

以上实例输出结果为:RUNOOB

第一个参数不为 NULL:

<font style="color:rgb(34, 34, 34);">SELECT IFNULL("Hello", "RUNOOB");</font>

以上实例输出结果为:Hello

<font style="color:rgb(34, 34, 34);">select IFNULL(real_name, “xiaoai”) from table_name</font>

以上实例输出结果为:如果real_name是null,则输出xiaoai;如果real_name不是null,则输出real_name

区别

  1. 参数个数:COALESCE函数可以接受多个参数,而IFNULL函数只能接受两个参数。
  2. 返回值:COALESCE函数返回参数列表中第一个非空值,如果所有参数都为空,则返回NULL。IFNULL函数返回第一个非空的参数,如果第一个参数为空,则返回第二个参数。

10.if()函数

IF(expr1,expr2,expr3)

如果expr1是TRUE ,则IF() 返回expr2。否则,它返回expr3。

示例1

示例2

mysql> SELECT IF(1>2,2,3);
        -> 3
mysql> SELECT IF(1<2,'yes','no');
        -> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

11.窗口函数8.0开始支持

dense_rank()

rank()

12.聚合函数

分类:

聚合函数是用来对一组数据进行计算并返回单个结果的函数,它们可以对列的值进行汇总、计算平均值、计算最大最小值等。

以下是一些常用的聚合函数:

  1. COUNT():用于计算满足指定条件的行数。例如,SELECT COUNT(*) FROM table_name 将返回表中的总行数。
  2. SUM():用于计算指定列的总和。例如,SELECT SUM(column_name) FROM table_name 将返回指定列值的总和。
  3. AVG():用于计算指定列的平均值。例如,SELECT AVG(column_name) FROM table_name 将返回指定列值的平均值。
  4. MIN():用于计算指定列的最小值。例如,SELECT MIN(column_name) FROM table_name 将返回指定列值的最小值。
  5. MAX():用于计算指定列的最大值。例如,SELECT MAX(column_name) FROM table_name 将返回指定列值的最大值。

注意:

  1. count(字段)不统计NULL记录,即表示满足条件的数据行里参数字段不为NULL的行
  2. count(1)和count(*)会记录NULL值
  3. 注意max(), min(), avg()都会忽略null值,而不是将其作为“0”参与计算
  4. sum(a)单列求和时如果a为null,则忽略这行的记录,多列求值sum(a+b+c)时,如果运算列a,b,c中任意一列的值为NULL,则忽略这行的记录

示例1:

select
    tag,
    difficulty,
    round(
        (sum(score) - max(score) - min(score)) / (count(score) -2),
        1
    ) as clip_avg_score
from
    exam_record
    inner join examination_info using (exam_id)
where
    tag = 'SQL'
    and difficulty = 'hard';

示例2:

select
    count(*) as total_pv,
    count(score) as complete_pv,
    count(
        distinct case
            when score is not null then exam_id
        end
    ) as complete_exam_cnt
from
    exam_record
select count(*) as total_pv,
count(score) as complete_pv,
count(distinct exam_id,score IS NOT NULL or null) as complete_exam_cnt
from exam_record

示例3:

select<font style="color:rgb(51, 51, 51);">在MySQL中,ANY_VALUE()是一个聚合函数,用于在SELECT查询中获取分组中的任意一个非聚合列的值。它可以在使用GROUP BY子句进行分组的查询中使用。</font>

<font style="color:rgb(51, 51, 51);">当在SELECT语句中使用GROUP BY子句时,通常需要在SELECT列表中包含聚合函数(如SUM、COUNT、MAX等)来对每个分组进行聚合计算。然而,对于其他非聚合列,MySQL要求在SELECT列表中明确指定它们的聚合方式(如使用MIN、MAX等聚合函数),否则会报错。</font>

<font style="color:rgb(51, 51, 51);">但是,如果我们只需要获取分组中的任意一个非聚合列的值,而不关心它的具体值是哪个,可以使用ANY_VALUE()函数。ANY_VALUE()函数可以放在非聚合列的前面,表示获取该列的任意一个值。</font>

<font style="color:rgb(51, 51, 51);">以下是一个示例:</font>

```plain
SELECT classification, ANY_VALUE(user_id) AS any_user_id
FROM exam_scores
GROUP BY classification;

13.any_value()聚合函数

在MySQL中,ANY_VALUE()是一个聚合函数,用于在SELECT查询中获取分组中的任意一个非聚合列的值。它可以在使用GROUP BY子句进行分组的查询中使用。

当在SELECT语句中使用GROUP BY子句时,通常需要在SELECT列表中包含聚合函数(如SUM、COUNT、MAX等)来对每个分组进行聚合计算。然而,对于其他非聚合列,MySQL要求在SELECT列表中明确指定它们的聚合方式(如使用MIN、MAX等聚合函数),否则会报错。

但是,如果我们只需要获取分组中的任意一个非聚合列的值,而不关心它的具体值是哪个,可以使用ANY_VALUE()函数。ANY_VALUE()函数可以放在非聚合列的前面,表示获取该列的任意一个值。

以下是一个示例:

  1. SELECT classification, ANY_VALUE(user_id) AS any_user_id
  2. FROM exam_scores
  3. GROUP BY classification;

上述查询按照试卷分类对成绩表进行分组,并使用ANY_VALUE()函数获取每个组中的任意一个user_id的值。通过将ANY_VALUE(user_id)作为一个非聚合列在SELECT列表中使用,我们可以避免对user_id进行额外的聚合函数操作。

需要注意的是,ANY_VALUE()函数在MySQL 5.7.5及以上版本中可用。在早期版本中,可能需要使用其他方法来获取分组中的任意一个非聚合列的值。

min(score) min_score_over_avg

from exam_record inner join examination_info using (exam_id) where tag = 'SQL' and score >= ( select avg(score) from exam_record inner join examination_info using (exam_id) where tag = 'SQL' )

14.concat及ws拼接

concat

CONCAT(str1,str2,…)

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

concat_ws

CONCAT_WS(separator, str1, str2,...)

CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。

注意:

如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

15.大小写转换lower和upper

MySQL 字符串大小写转化函数有两对: lower(), uppper() 和 lcase(), ucase():

select lower('AAA'); 
select upper('aaa'); 

select lcase('AAA'); 
select ucase('aaa'); 

16.截取函数

TRUNCATE(x,d)截断数值

TRUNCATE(X,D) 是MySQL自带的一个系统函数。

其中,X是数值,D是保留小数的位数。

其作用就是按照小数位数,进行数值截取(此处的截取是按保留位数直接进行截取,没有四舍五入)。

规则如下:

1)当 D 大于0,是对数值 X 的小数位数进行操作;

2)当 D 等于0,是将数值 X 的小数部分去除,只保留整数部分;

3)当 D 小于0,是将数值 X 的小数部分去除,并将整数部分按照 D 指定位数,用 0 替换。

SELECT TRUNCATE(123.4567, 3); # 123.456
SELECT TRUNCATE(123.4567, 2); # 123.45
SELECT TRUNCATE(123.4567, 1); # 123.4
SELECT TRUNCATE(123.4567, 0); # 123
SELECT TRUNCATE(123.4567, -1); # 120
SELECT TRUNCATE(123.4567, -2); # 100
SELECT TRUNCATE(123.4567, -3); # 0
SELECT TRUNCATE(-123.4567, 3); # -123.456
SELECT TRUNCATE(-123.4567, 2); # -123.45
SELECT TRUNCATE(-123.4567, 1); # -123.4
SELECT TRUNCATE(-123.4567, 0); # -123
SELECT TRUNCATE(-123.4567, -1); # -120
SELECT TRUNCATE(-123.4567, -2); # -100
SELECT TRUNCATE(-123.4567, -3); # 0

left(str, length)

left(str, length)是从左边第一位开始截取指定长度字符串。length不能是负数,如果是负数不会报错,结果是null,等价于0

right(str, length)

substring(str, index, length)

substring(str, index, length)是从指定开始位置截取指定长度字符串。

其中,str是要截取的字符串,index是截取的起始位置,length是截取的长度。

SELECT SUBSTRING('Hello World',7,5)AS result;

上述示例将返回字符串'World',从第7个字符开始,截取长度为5的子串。

注意: 使用的时候函数名和括号之间不能有空格,必须紧挨着

正确示例

SELECT SUBSTRING('Hello World', 7, 5) AS result;

错误示例

SELECT SUBSTRING ('Hello World', 7, 5) AS result;

substring(str, index)

substring(str, index)是从指定开始位置截字符串,截取到最后。

substr()

区别:

  • 在MySQL中,SUBSTRING和SUBSTR这两个函数可以互换使用,没有明显的功能区别。
  • SUBSTRING函数的语法在标准SQL中是被定义的,而SUBSTR函数在标准SQL中并没有明确的定义,但是MySQL支持使用SUBSTR函数来实现相同的功能。
  • 在一些其他数据库中,如Oracle,SUBSTR是标准的字符串截取函数,而SUBSTRING并不是标准的函数。

综上所述,SUBSTRING和SUBSTR函数在MySQL中用于提取字符串的子串,它们的作用和用法几乎相同。它们的选择可以基于个人习惯和代码风格。

17.数学计算函数

round保留小数

在mysql中,round函数用于数据的四舍五入,它有两种形式

  1. round(x,d) ,x指要处理的数,d是指保留几位小数
 select round(100.521, 1);  -- 100.5
 select round(100.521, 2);  -- 100.52
  1. round(x) ,其实就是round(x,0),也就是默认d为0;
select round(100.5); -- 101
select round(100.4); -- 100

abs(x) 绝对值

select ABS(-5); 5

PI() 圆周率 默认6位小数

select PI(); 3.141593

mod(x, y)求余数

mod(被除数, 除数)

select MOD(6,2); -- 0
select MOD(6,5); -- 1


ceil和ceiling

ceil和ceiling相同,前者是后者的缩写,ceil(x)作用是返回不小于x的最小整数

select CEIL(2.5); --   3

select CEIL(-2.5); --   -2

floor(x)

返回不大于x的最大正整数

select FLOOR(3.3); --   3

select FLOOR(-3.3); --   -4

rand()

获取0-1之间随机数

rand(x)

获取0-1之间随机数;x值相同则产生的随机数相同

无论执行多少次rand(2),只要2不变,结果就不变

log(x)以e为底数的对数

log10(x)以10为底数的对数

18.查找函数instr和locate

instr

INSTR(str, substr)函数用于返回子串 substr 在字符串 str 中第一次出现的索引位置,从1开始,没有找到子串时返回 0

INSTR(str, substr, n)函数用于返回子串 substr 在字符串 str 中从第n个位置开始,第一次出现的索引位置

locate

LOCATE(substr, str)函数返回子串 substr 在字符串 str 中从位置 pos 开始第一次出现的索引位置,和 INSTR(str,substr) 函数唯一的不同就是参数的顺序相反。

19.日期函数

当前日期

select CURRENT_DATE(); -- 2022-11-14
select CURRENT_DATE; -- 2022-11-14
select CURDATE(); -- 2022-11-14

select CURRENT_DATE()+0; -- 20221114
select CURRENT_DATE+0; -- 20221114
select CURDATE()+0; -- 20221114

当前时间

select CURRENT_TIME(); -- 18:14:18
select CURRENT_TIME; -- 18:14:18
select CURTIME(); -- 18:14:18
select CURTIME()+0; -- 181418

当前日期时间

select CURRENT_TIMESTAMP(); -- 2022-11-14 18:15:06
select NOW(); -- 2022-11-14 18:16:20

格式化时间(把时间类型转化成指定格式字符串)

DATE_FORMAT(date,format)   -- date 参数是合法的日期。format 规定日期/时间的输出格式。

select DATE_FORMAT(NOW(),'%m/%d/%Y'); -- 11/15/2022
select DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'); -- 2022/11/15 10:14:56
select DATE_FORMAT(NOW(),'%Y年%m月%d日 %T'); -- 2022年11月15日 10:24:04
-- %T 可以代替 %H:%i:%s
格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位

时间计算

加法

DATE_ADD() 函数向日期添加指定的时间间隔。

DATE_ADD(date,INTERVAL expr type)
-- date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
-- type 参数可以是 DAY HOUR MINUTE SECOND YEAR MONTH 等更多
-- NOW() 是 2022-11-15 10:42:44
select DATE_ADD(NOW(), INTERVAL 2 YEAR); -- 2024-11-15 10:42:44
select DATE_ADD(NOW(), INTERVAL 1 MONTH); -- 2022-12-15 10:42:44
select DATE_ADD(NOW(), INTERVAL 10 DAY); -- 2022-11-25 10:42:44
select DATE_ADD(NOW(), INTERVAL 2 HOUR); -- 2022-11-25 12:42:44

select '2021-09-01 22:11:12' +INTERVAL 50 minute;
select DATE_ADD('2021-09-01 22:11:12',INTERVAL 50 minute);

ADDDATE()和DATE_ADD()作用相同,但当只进行以日为单位的日期加减时ADDDATE()有一个简写的使用方法
select ADDDATE(NOW(),1) <=> select DATE_ADD(NOW(), INTERVAL 1 DAY)

减法

-- 语法和DATE_ADD()相同
select DATE_SUB(NOW(),INTERVAL 1 YEAR); -- 2021-11-15 10:47:35
-- 当前时间先加2小时,再减去1年
select DATE_SUB(DATE_ADD(NOW(), INTERVAL 2 HOUR),INTERVAL 1 YEAR); -- 2021-11-15 12:50:22

SUBDATE()和ADDDATE()同理

相差时间

TIMESTAMPDIFF(unit,start,end) 返回两个日期之间的时间
-- unit 相差的时间单位 SECOND MINUTE HOUR DAY WEEK MONTH QUARTER - 季度(3个月) YEAR 
-- start 起始时间
-- end 结束时间
-- 结果有正负之分,如果start > end,那么返回负数
select TIMESTAMPDIFF(MINUTE,'2023-10-10 10:10:10','2023-10-10 10:15:10') -- 5

相差天数

DATEDIFF() 函数返回两个日期之间的天数。
DATEDIFF(date1,date2) 
-- date1 和 date2 参数是合法的日期或日期/时间表达式。
-- 只有值的日期部分参与计算。

SELECT DATEDIFF('2022-11-29','2022-10-30'); -- 30
SELECT DATEDIFF('2022-11-29','2022-12-30'); -- -31
SELECT DATEDIFF(DATE_ADD(NOW(), INTERVAL 2 YEAR), NOW()); -- 731
-- 如果想要得到正数,日期大的要放在前面

返回日期部分

DATE() 函数返回日期或日期/时间表达式的日期部分。
DATE(date) -- date 参数是合法的日期表达式。

select DATE(NOW()); -- 2022-11-15
select DATE('2022-11-29 10:47:35'); -- 2022-11-29
select DATE(DATE_ADD(NOW(), INTERVAL 2 YEAR)); -- 2024-11-15

返回日期/时间的单独部分

EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
EXTRACT(unit FROM date)
date 参数是合法的日期表达式。
unit 参数可以是下列的值:SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, WEEK, YEAR_MONTH等等更多
-- NOW() 2022-11-15 11:11:12 
select EXTRACT(YEAR FROM NOW()); -- 2022
select EXTRACT(MONTH FROM NOW()); -- 11
select EXTRACT(DAY FROM NOW()); -- 15
select EXTRACT(HOUR FROM NOW()); -- 11
select EXTRACT(MINUTE FROM NOW()); -- 11
select EXTRACT(SECOND FROM NOW()); -- 12
select EXTRACT(WEEK FROM NOW()); -- 46 今年的第46周 
select EXTRACT(YEAR_MONTH FROM NOW()); -- 202211
select EXTRACT(QUARTER FROM NOW()); -- 4 今年的第4季度


select year(CURRENT_DATE());
select month(CURRENT_DATE());
select day(CURRENT_DATE());

select HOUR(CURRENT_TIME());
select MINUTE(CURRENT_TIME());
select SECOND(CURRENT_TIME());

select year('2023-08-30 18:31:22');
select month('2023-08-30 18:31:22');
select day('2023-08-30 18:31:22');

select HOUR('2023-08-30 18:31:22');
select MINUTE('2023-08-30 18:31:22');
select SECOND('2023-08-30 18:31:22');

字符串转datetime类型

str_to_date

str_to_date(str, format)

str:要格式化为日期的字符串

format:要使用的常用格式

format格式描述
%Y年份为数字,4位数值
%y年份为数字,2位数值
%M月份名称(1月至12月)
%m月份名称作为数值(00到12)
%d作为数值的月份日期(01到31)
%e每月的某一天作为数值(0到31)
%H小时(00到23)
%h小时(00到12)
%i分钟(00至59)
%S秒(00到59)
%s秒(00到59)
%T24小时格式的时间(hh:mm:ss)
%r时间为12小时AM或PM格式(hh:mm:ss AM / PM)
%p上午或下午
%f微秒(000000至999999)
-- 最常用
select STR_TO_DATE('2005-12-21 18:30:26','%Y-%m-%d %H:%i:%s');
-- 2005-12-21 18:30:26
select STR_TO_DATE('2005-12-21 18:30:26','%Y-%m-%d %T');
-- 2005-12-21 18:30:26
select STR_TO_DATE('2005-12-21','%Y-%m-%d');
-- 2005-12-21

select STR_TO_DATE('1995/12/21','%Y/%m/%d');
-- 1995-12-21
select STR_TO_DATE('2005/12/21 8:30:26','%Y/%m/%d %H:%i:%s');
-- 2005-12-21 08:30:26
select STR_TO_DATE('2005/12/21 18:30:26:1234','%Y/%m/%d %H:%i:%s:%f');
-- 2005-12-21 18:30:26.123400
select STR_TO_DATE('2005/12/21 18:30:26','%Y/%m/%d %T');
-- 2005-12-21 18:30:26
select STR_TO_DATE('2005/12/21 6:30:26 PM','%Y/%m/%d %r');
-- 2005-12-21 18:30:26

CAST

CAST() 函数用于类型转换,将(任何类型的)值转换为指定的数据类型

CAST(字符串值 AS datetime)

select CAST('2005-12-21 18:30:26' AS datetime);
-- 2005-12-21 18:30:26
select CAST('2005-12-21' AS date);
-- 2005-12-21

20.convert()转换

  1. 数据类型转换:CONVERT函数用于将一个数据类型转换为另一个数据类型。它可以将字符串、日期、数值等类型进行转换。例如,可以将一个字符串转换为数字,或者将一个日期转换为字符串等。
  2. 字符集转换:CONVERT函数还可以用于进行字符集的转换。通过指定不同的字符集,可以将一个字符串从一个字符集转换为另一个字符集。这对于解决字符集不匹配的问题非常有用。
  3. 格式化输出:CONVERT函数还可以用于格式化输出。通过指定适当的格式,可以将数据以某种特定的格式进行输出,如货币格式、日期时间格式等。

下面是一些使用CONVERT函数的示例:

  • 将数字转换为字符串:SELECT CONVERT(123, CHAR);
  • 将字符串转换为数字:SELECT CONVERT('456', SIGNED);
  • 将日期转换为字符串:SELECT CONVERT(NOW(), CHAR);
  • 进行字符集转换:SELECT CONVERT('中文', CONVERT('中文' USING GBK) USING UTF8);
  • 格式化输出日期:SELECT CONVERT(NOW(), DATETIME FORMAT 'YYYY-MM-DD HH:MI:SS');

需要注意的是,CONVERT函数的具体用法和可用的参数取决于MySQL的版本和所使用的函数库。在使用CONVERT函数时,应该根据具体需求和MySQL的文档来正确使用和理解该函数。