4. 日期和时间函数
4.1 获取日期、时间
#日期、时间函数 SELECT CURDATE(),CURTIME(),NOW(),SYSDATE()+0,UTC_DATE(),UTC_DATE()+0,UTC_TIME(),UTC_TIME()+0 FROM DUAL;
4.2 日期与时间戳的转换
何为时间戳?
时间戳就是从1970年1月1日0时0分0秒到当前时间点的所有秒数。
1970.1.1 0:0:0 这个时间就是IT中所谓的“时间纪元”,相信大家在很多文章中都见过它。
比如oracle的时间显示,unix和linux系统的时间运算等,那为什么选择1970,而不选择1900呢。接下来让我们阐述它的由来。
#代码测试 #日期与时间戳的转换 SELECT UNIX_TIMESTAMP(NOW()),UNIX_TIMESTAMP(CURDATE()),UNIX_TIMESTAMP(CURTIME()),FROM_UNIXTIME(1677118000) FROM DUAL;
4.3 获取月份、星期、星期数、天数等函数
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE()) FROM DUAL;
4.4 日期的操作函数
EXTRACT(type FROM date)函数中type的取值与含义:
SELECT EXTRACT(MINUTE FROM NOW()),EXTRACT( WEEK FROM NOW()), EXTRACT( QUARTER FROM NOW()),EXTRACT( MINUTE_SECOND FROM NOW()) FROM DUAL;
4.5 时间和秒钟转换的函数
SELECT TIME_TO_SEC(NOW()), SEC_TO_TIME(61000)
FROM DUAL;
4.6 计算日期和时间的函数
上述函数中type的取值:
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS col1,DATE_ADD('2021-10-21 23:32:12',INTERVAL1 SECOND) AS col2, ADDDATE('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col3, DATE_ADD('2021-10-21 23:32:12',INTERVAL '1_1' MINUTE_SECOND) AS col4, DATE_ADD(NOW(), INTERVAL -1 YEAR) AS col5, #可以是负数 DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH) AS col6 #需要单引号 FROM DUAL;
SELECT ADDTIME(NOW(),20),SUBTIME(NOW(),30),SUBTIME(NOW(),'1:1:3'),DATEDIFF(NOW(),'2021-10-01'), TIMEDIFF(NOW(),'2021-10-25 22:10:10'),FROM_DAYS(366),TO_DAYS('0000-12-25'), LAST_DAY(NOW()),MAKEDATE(YEAR(NOW()),12),MAKETIME(10,21,23),PERIOD_ADD(20200101010101,10) FROM DUAL;
4.7 日期的格式化与解析
上述函数中fmt参数常用的格式符:
GET_FORMAT函数中date_type和format_type参数取值如下:
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'),STR_TO_DATE('09/01/2009','%m/%d/%Y'),STR_TO_DATE('20140422154706','%Y%m%d%H%i%s'), STR_TO_DATE('2014-04-22 15:47:06','%Y-%m-%d %H:%i:%s'),GET_FORMAT(DATE, 'USA'),DATE_FORMAT(NOW(),GET_FORMAT(DATE,'USA')), STR_TO_DATE('2020-01-01 00:00:00','%Y-%m-%d') FROM DUAL;
5. 流程控制函数
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。
MySQL中的流程处理函数主要包括 IF()、IFNULL()和CASE()函数。
#4.4 CASE ... WHEN ... THEN ... WHEN ... THE ... ELSE ... END
/* 练习1:查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。 其他部门,打印其工资的1.4倍数 */ #实现方式一: SELECT employee_id,last_name,department_id,salary,CASE department_id WHEN 10 THEN salary *1.1 WHEN 20 THEN salary *1.2 WHEN 30 THEN salary *1.3 ELSE salary * 1.4 END "detalis" FROM employees; #实现方式二: SELECT employee_id,last_name,department_id,salary,CASE WHEN department_id = 10 THEN salary * 1.1 WHEN department_id = 20 THEN salary * 1.2 WHEN department_id = 30 THEN salary * 1.3 ELSE salary * 1.4 END "detalis" FROM employees;
6. 加密与解密函数
加密与解密函数主要用于对数据库中的数据进行加密和解密处理,以防止数据被他人窃取。这些函数在
保证数据库安全时非常有用。
SELECT MD5('mysql'),SHA('mysql'),MD5(MD5('mysql')) FROM DUAL;
# ENCODE() \ DECODE() PASSWORD()在mysql1 8.0 中弃用 SELECT ENCODE('atguigu','mysql'),DECODE(ENCODE('atguigu','mysql'),'mysql') FROM DUAL;
7. MySQL信息函数
MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地对数据库 进行维护工作。
SELECT USER(), CURRENT_USER(), SYSTEM_USER(),SESSION_USER(),CHARSET('ABC'),COLLATION('ABC') FROM DUAL;
8. 其他函数
MySQL中有些函数无法对其进行具体的分类,但是这些函数在MySQL的 开发和运维过程中也是不容忽视的。
SELECT INET_ATON('192.168.1.100'),CHARSET('mysql'), CHARSET(CONVERT('mysql' USING 'utf8')) FROM DUAL;