1、日期函数
首先创建一个表 t10,
# 创建一个表 t10 CREATE TABLE t10 (`name` VARCHAR(12), m_date DATE,m_time TIME, m_datetime DATETIME, m_stamp TIMESTAMP); # 插入两条数据 INSERT INTO t10 VALUES('Z', '2020-11-22', '16:15:32', '2020-11-22 16:15:32', NOW()); INSERT INTO t10 VALUES('W', CURRENT_DATE, CURRENT_TIME, NOW(), CURRENT_TIMESTAMP()); # 查询表数据 mysql> SELECT * FROM t10; +------+------------+----------+---------------------+---------------------+ | name | m_date | m_time | m_datetime | m_stamp | +------+------------+----------+---------------------+---------------------+ | Z | 2020-11-22 | 16:15:32 | 2020-11-22 16:15:32 | 2021-08-16 15:43:24 | | W | 2021-08-16 | 16:26:59 | 2021-08-16 16:26:59 | 2021-08-16 16:26:59 | +------+------------+----------+---------------------+---------------------+
1.1 获取当前系统时间
以下函数均可以用户查询,也可以用在插入数据上。
1)获取当前系统的日期
,current_date()
,格式是:YYYY-MM-DD
。
2)获取当前系统的时间
,current_time()
,格式是:hh-mm-ss
。
3)获取当前系统的日期+时间
,current_timestamp()
,格式是:YYYY-MM-DD hh:mm:ss
。
4)获取当前系统的日期+时间
,now()
,格式是:YYYY-MM-DD hh:mm:ss
。
# 1、用于查询 mysql> SELECT CURRENT_DATE(), CURRENT_TIME(), NOW(), CURRENT_TIMESTAMP() FROM DUAL; +----------------+----------------+---------------------+---------------------+ | CURRENT_DATE() | CURRENT_TIME() | NOW() | CURRENT_TIMESTAMP() | +----------------+----------------+---------------------+---------------------+ | 2021-08-16 | 16:48:57 | 2021-08-16 16:48:57 | 2021-08-16 16:48:57 | +----------------+----------------+---------------------+---------------------+ # 2、也可用于插入数据 INSERT INTO t10 VALUES('W', CURRENT_DATE(), CURRENT_TIME(), NOW(), CURRENT_TIMESTAMP());
1.2 date和time(提取日期和时间)
date()
:取出时间字段的日期
,格式是:YYYY-MM-DD
。
time()
:取出时间字段的时间
,格式是:格式是:hh-mm-ss
。
year()
:取出时间字段的年
,month()
:取出时间字段的月
,day()
:取出时间字段的日
,hour()
:取出时间字段的小时
,minute()
:取出时间字段的分钟
,second()
:取出时间字段的秒
。
mysql> SELECT DATE(m_datetime) '提取日期', TIME(m_datetime) '提取时间', TIME(m_date) FROM t10 WHERE `name`='Z'; +--------------+--------------+--------------+ | 提取日期 | 提取时间 | TIME(m_date) | +--------------+--------------+--------------+ | 2020-11-22 | 16:15:32 | 00:00:00 | +--------------+--------------+--------------+
1.3 时间加减法
1)加法,date_add(datetime, INTERVAL delta_value delta_type)
:一个日期加上一段时间(间隔),间隔可以是year
,month
,day
,hour
,minute
,second
,或者他们之间的拼接,例如,day_second
、year_hour
等。
2)减法,date_sub(datetime, INTERVAL delta_value delta_type)
:一个日期减去一段时间(间隔),间隔单位同上。
# 1、date_add、date_sub用法 mysql> SELECT m_date '原日期', DATE_ADD(m_date, INTERVAL 2 YEAR) '加两年', DATE_SUB(m_date, INTERVAL 2 YEAR) '减两年' FROM t10; +------------+------------+------------+ | 原日期 | 加两年 | 减两年 | +------------+------------+------------+ | 2020-11-22 | 2022-11-22 | 2018-11-22 | | 2021-08-16 | 2023-08-16 | 2019-08-16 | +------------+------------+------------+ SELECT DATE_ADD('2021-08-17 16:15:3s2', INTERVAL 1 HOUR) FROM DUAL; # 2021-08-17 17:15:32 SELECT DATE_ADD('2021-08-17', INTERVAL 1 HOUR) FROM DUAL; # 2021-08-17 01:00:00
3)相减,datediff(expr1, expr2)
:日期 1 减去日期 2 ,得到两者之间相差的天数,expr 可以是日期(date)也可以是 日期+时间(datetime)。
# 2、datediff的用法 mysql> SELECT NOW(), DATEDIFF(NOW(), '2021-06-12 23:12:32') 'datediff' FROM DUAL; # 1 +---------------------+----------+ | NOW() | datediff | +---------------------+----------+ | 2021-08-17 17:14:44 | 66 | +---------------------+----------+ SELECT DATEDIFF('2021-08-17 17:02:33', '2021-08-16 23:12:32') FROM DUAL; # 1 SELECT DATEDIFF('2021-08-17 16:15:32', '2021-08-17 16:12:32') FROM DUAL; # 0
timediff(expr1, expr2)
:时间 1 减去时间 2 ,得到两者之间相差的时间,expr 可以是日期(date)也可以是 日期+时间(datetime)。
# time类 SELECT TIMEDIFF('17:02:33', '13:12:32') FROM DUAL; # 03:50:01 # datetime类 SELECT TIMEDIFF('2021-08-17 17:02:33', '2021-08-11 23:12:32') FROM DUAL; # 137:50:01
period_diff(expr1, expr2)
:返回期间相差的月数,expr 的格式是为 YYMM
或 YYYYMM
。
# period_diff SELECT PERIOD_DIFF(200802,200703) FROM DUAL; # 11
小例子 9 :在此时此刻的日期时间基础上加 2 天,2小时,2秒,用 dual
表实现?
mysql> SELECT NOW(), DATE_ADD(NOW(), INTERVAL '2 2:0:2' DAY_SECOND) FROM DUAL; +---------------------+------------------------------------------------+ | NOW() | DATE_ADD(NOW(), INTERVAL '2 2:0:2' DAY_SECOND) | +---------------------+------------------------------------------------+ | 2021-08-17 16:39:47 | 2021-08-19 18:39:49 | +---------------------+------------------------------------------------+
其他还有很多的函数用法,可以参考手册进行学习。
- | 日期部分 | 时间部分 | 日期和时间 |
当前 | CURDATE() 和 CURRENT_DATE() |
CURTIME() 和 CURRENT_TIME() |
NOW() 和 CURRENT_TIMESTAMP() |
加 | ADDDATE(date, INTERVAL expr unit) 和 DATE_ADD(date, INTERVAL expr unit) |
ADDTIME(expr1, expr2) |
TIMESTAMPADD(interval,int_expr,datetime_expr) |
减 | DATE_SUB(date, INTERVAL expr unit) |
||
计差 | DATEDIFF(expr1, expr2) |
可用TIMESTAMPDIFF |
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) |
格式化 | DATE_FORMAT(date, format) |
||
其他 | DATE(expr) :提取日期部分 |
2、加密函数
1)md5(str)
函数:求解字符串的哈希值,返回一个 32 个 16 进制数的字符串形式。
mysql> SELECT MD5('冲冲冲') 'md5', LENGTH(MD5('冲冲')) 'md5长度' FROM DUAL; +----------------------------------+-----------+ | md5 | md5长度 | +----------------------------------+-----------+ | 7268a39a3e0d9e04ede81987a83bfc09 | 32 | +----------------------------------+-----------+
2)password(str)
函数仅在 MySQL5.7.5
之前的版本中生效,因为我安装的是 MySQL8.0 ,所以用不了此函数,但可以用sha1
函数间接替代。
# 5.7.5之前的版本 mysql> SELECT PASSWORD('mypass'); +-------------------------------------------+ | PASSWORD('mypass') | +-------------------------------------------+ | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +-------------------------------------------+ # 替代方案 mysql> SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))); +-------------------------------------------------+ | CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))) | +-------------------------------------------------+ | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +-------------------------------------------------+
3、流程控制函数
说白了就是逻辑语句if else
之类的,
mysql> SELECT * FROM t9; +-----------------+------+---------+---------+ | name | math | chinese | english | +-----------------+------+---------+---------+ | 关羽 | NULL | 58 | 0 | | 宋江 | 98 | 96 | 82 | | 我是及时雨 | 78 | 86 | 92 | | 宋无缺 | 98 | 96 | 92 | +-----------------+------+---------+---------+
1)if else 语句,if(expr1, expr2, expr3)
:相当于C++中的三元运算符,当 expr1 为True
时,返回 expr2 ,为False
则返回 expr3 。
mysql> SELECT `name` '姓名', IF(math>90, '优秀', '加油') '数学' FROM t9; +-----------------+--------+ | 姓名 | 数学 | +-----------------+--------+ | 关羽 | 加油 | | 宋江 | 优秀 | | 我是及时雨 | 加油 | | 宋无缺 | 优秀 | +-----------------+--------+ SELECT IF(FALSE, '真李逵', '假李逵') FROM DUAL; # 假李逵 SELECT IF(TRUE, '真李逵', '假李逵') FROM DUAL; # 真李逵
2)判断是否为空,ifnull(expr1, expr2)
:当 expr1 不为NULL
时,返回 expr1 ,为NULL
则返回 expr2 。
mysql> SELECT `name` '姓名', IFNULL(math, '旷考\U+274C') '数学分数' FROM t9; +-----------------+--------------+ | 姓名 | 数学分数 | +-----------------+--------------+ | 关羽 | 旷考❌ | | 宋江 | 98 | | 我是及时雨 | 78 | | 宋无缺 | 98 | +-----------------+--------------+
3)流程控制语句 case,(CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END)
:当 expr1 为True
时,返回 expr2 ,直接结束,不在进行下面的判断;若为False
,则进行下面的判断, expr3 为True
时,返回 expr4 ;以此类推,如果最终还是没有满足,则返回 ELSE
下的值,然后 END 结束。
mysql> SELECT `name` '姓名', (CASE WHEN math>90 THEN '优秀' WHEN math>70 THEN ' 良好' WHEN math>60 THEN '及格' ELSE '不及格' END) '数学分数' FROM t9; +-----------------+--------------+ | 姓名 | 数学分数 | +-----------------+--------------+ | 关羽 | 不及格 | | 宋江 | 优秀 | | 我是及时雨 | 良好 | | 宋无缺 | 优秀 | +-----------------+--------------+
其他函数
SELECT DATEBASE(); # 2、查询当前所有登录到 mysql 的用户+ip,可查看在线人数 mysql> SELECT USER() 'user+ip' FROM DUAL; +----------------+ | user+ip | +----------------+ | root@localhost | +----------------+
总结:
想学就去学,学了就别后悔,不要犹豫!
我是西园公子,关注我和我一起向大牛前进~
参考文章:
date、time的用法:https://www.docs4dev.com/docs/zh/mysql/5.7/reference/date-and-time-functions.html
加密函数:https://www.docs4dev.com/docs/zh/mysql/5.7/reference/encryption-functions.html#function_md5