MySQL学习笔记06-日期_加密_流程控制函数详解

2,058次阅读
没有评论

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):一个日期加上一段时间(间隔),间隔可以是yearmonthdayhourminutesecond,或者他们之间的拼接,例如,day_secondyear_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 的格式是为 YYMMYYYYMM

# 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

1
西园公子
版权声明:本站原创文章,由西园公子2021-09-11发表,共计7402字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...