3 时间和日期函数
3.1 获取当前日期和获取当前时间
(1)CURDATE()和CURRENT_DATE(),将当前日期按照‘YYYY-MM-DD’或YYYYMMDD格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。
mysql> select curdate(),current_date(),curdate()+0;
+------------+----------------+-------------+
| curdate() | current_date() | curdate()+0 |
+------------+----------------+-------------+
| 2016-02-20 | 2016-02-20 | 20160220 |
+------------+----------------+-------------+
1 row in set
(2)CURTIME()和CURRENT_TIME(),将当前时间以‘HH:MM:SS’或HHMMSS的格式返回。
mysql> select curtime(),current_time(),curtime()+0;
+-----------+----------------+-------------+
| curtime() | current_time() | curtime()+0 |
+-----------+----------------+-------------+
| 11:25:56 | 11:25:56 | 112556 |
+-----------+----------------+-------------+
1 row in set
3.2 同时获取当前日期时间
NOW()、CURRENT_TIMESTAMP()、LOCALTIME()、SYSDATE(),均返回当前日期和时间值,格式为‘YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS。
mysql> select current_timestamp(),localtime(),now(),sysdate();
+---------------------+---------------------+---------------------+---------------------+
| current_timestamp() | localtime() | now() | sysdate() |
+---------------------+---------------------+---------------------+---------------------+
| 2016-02-20 11:28:41 | 2016-02-20 11:28:41 | 2016-02-20 11:28:41 | 2016-02-20 11:28:41 |
+---------------------+---------------------+---------------------+---------------------+
1 row in set
3.3 计算日期和时间函数
(1)DATE_ADD(date,INTERVAL expr type)或者ADDDATE(date,INTERVAL expr type),执行日期的运算
(2)DATE_SUB(date,INTERVAL expr type)或者SUBDATE(date,INTERVAL expr type),执行日期的运算
(3)ADDTIME(date,expr):将expr值添加到date;SUBTIME(date,expr):date减去expr值。
(4)DATEDIFF(date1,date2):返回起始时间date1和结束时间date2之间的天数。
3.4 将日期和时间格式化的函数
DATE_FORMAT(date,format):根据format指定的格式显示date值。主要的format格式如下表:
格式 | 描述 | 格式 | 描述 |
---|---|---|---|
%a | 缩写星期名 | %p | AM 或 PM |
%b | 缩写月名 | %r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%c | 月,数值 | %S,%s | 秒(00-59) |
%D | 带有英文前缀的月中的天 | %T | 时间, 24-小时 (hh:mm:ss) |
%d | 月的天,数值(00-31) | %U | 周 (00-53) 星期日是一周的第一天 |
%e | 月的天,数值(0-31) | %u | 周 (00-53) 星期一是一周的第一天 |
%f | 微秒 | %V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%H | 小时 (00-23) | %v | 周 (01-53) 星期一是一周的第一天,与%x使用 |
%h,%I | 小时 (01-12) | %W | 星期名 |
%i | 分钟,数值(00-59) | %w | 周的天 (0=星期日, 6=星期六) |
%j | 年的天 (001-366) | %X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%k | 小时 (0-23) | %x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%l | 小时 (1-12) | %Y | 年,4 位 |
%M | 月名 | %y | 年,2 位 |
%m | 月,数值(00-12) | %% | ‘%’文字字符 |
例子:
mysql> select date_format(now(),'%W %M %Y') as col1,
-> date_format(now(),'%D %y %a %d %m %b %j') as col2,
-> date_format(now(),'%H:%i:%s') as col3,
-> date_format('2016-02-20','%X %V')as col4;
+------------------------+---------------------------+----------+---------+
| col1 | col2 | col3 | col4 |
+------------------------+---------------------------+----------+---------+
| Saturday February 2016 | 20th 16 Sat 20 02 Feb 051 | 13:10:39 | 2016 07 |
+------------------------+---------------------------+----------+---------+
1 row in set
3.5 其他日期时间函数
(1)获取月份的函数MONTH(date)和MONTHNAME(date)
(2)获取星期的函数DAYNAME(d)、DAYOFWEEK(d)和WEEKDAY(d)
(3)获取星期数的函数WEEK(d)和WEEKOFYEAR(d)
(4)获取天数的函数DAYOFYEAR(d)和DAYOFMONTH(d)
(5)获取年份YEAR(date)、季度QUARTER(date)、分钟MINUTE(time)和秒钟SECOND(time)
(6)时间和秒钟转换:TIME_TO_SEC(time)和SEC_TO_TIME(seconds)
4 系统信息函数
4.1 获取版本号、连接数、数据库名
(1)VERSION(),返回指示MySQL服务器版本的字符串,这个字符串使用utf8字符集。
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.24 |
+-----------+
1 row in set
(2)DATABASE()和SCHEMA(),返回使用utf8字符集的默认(当前)数据库名。
mysql> SELECT DATABASE(),SCHEMA();
+------------+----------+
| DATABASE() | SCHEMA() |
+------------+----------+
| test | test |
+------------+----------+
1 row in set
(3)CONNECTION_ID(),返回MySQL服务器当前连接的次数,每个连接都有各自唯一的ID。
mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
| 11 |
+-----------------+
1 row in set
(4)SHOW PROCESSLIST; SHOW FULL PROCESSLIST;
processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态,帮助识别出有问题的查询语句等。
如果是root账号,能看到所有用户的当前连接。如果是普通用户,则只能看到自己占用的连接。show processlist;只列出前100条,如果想全部列出可使用show full processlist命令。
mysql> SHOW PROCESSLIST;
+----+------+-----------------+------+---------+-------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------+------+---------+-------+-------+------------------+
| 9 | root | localhost:14493 | NULL | Sleep | 11492 | | NULL |
| 10 | root | localhost:14494 | test | Sleep | 11491 | | NULL |
| 11 | root | localhost:14495 | test | Query | 0 | init | SHOW PROCESSLIST |
+----+------+-----------------+------+---------+-------+-------+------------------+
3 rows in set
各个列的含义和用途:
(1)Id列:用户登录MySQL时,系统分配的“connection id”;
(2)User列:显示当前用户,如果不是root,这个命令就只显示用户权限范围内的sql语句。
(3)Host列:显示这个语句是从哪个ip的哪个端口上发出的,可以用来追踪出现问题语句的用户。
(4)db列:显示这个进程目前连接的是哪个数据库。
(5)Command列:显示当前连接的执行的命令,一般取值为休眠(Sleep),查询(Query),连接(Connect)。
(6)Time列:显示这个状态持续的时间,单位是秒。
(7)State列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有状态的描述,State只是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过Copying to tmp table,Sorting result,Sending data等状态才可以完成。
(8)Info列:显示这个sql语句,是判断问题语句的一个重要依据。
4.2 获取用户名函数
USER()、CURRENT_USER()、CURRENT_USER、SYSTEM_USER()、SESSION_USER()这个几个函数返回当前被MySQL服务器验证的用户名和主机名组合。一般情况下,这几个函数的返回值是相同的。
mysql> SELECT USER(),CURRENT_USER(),CURRENT_USER,SYSTEM_USER();
+----------------+----------------+----------------+----------------+
| USER() | CURRENT_USER() | CURRENT_USER | SYSTEM_USER() |
+----------------+----------------+----------------+----------------+
| root@localhost | root@localhost | root@localhost | root@localhost |
+----------------+----------------+----------------+----------------+
1 row in set
4.3 获取最后一个自动生成的ID值的函数
LAST_INSERT_ID()自动返回最后一个INSERT或UPDATE为AUTO_INCREMENT列设置的第一个发生的值。
(1)一次插入一条记录
mysql> create table stu(id int auto_increment primary key,name varchar(20));
Query OK, 0 rows affected
mysql> insert into stu(name) values('jtzen9');
Query OK, 1 row affected
mysql> insert into stu(name) values('heiheihei');
Query OK, 1 row affected
mysql> select * from stu;
+----+-----------+
| id | name |
+----+-----------+
| 1 | jtzen9 |
| 2 | heiheihei |
+----+-----------+
2 rows in set
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 2 |
+------------------+
1 row in set
(2)一次插入多条记录
mysql> insert into stu(name) values('John'),('Nick'),('Mike');
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from stu;
+----+-----------+
| id | name |
+----+-----------+
| 1 | jtzen9 |
| 2 | heiheihei |
| 3 | John |
| 4 | Nick |
| 5 | Mike |
+----+-----------+
5 rows in set
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 3 |
+------------------+
1 row in set
LAST_INSERT_ID()只返回插入的第一行数据时产生的值,在这里为第3条记录,因为这使依靠其他服务器复制同样的INSERT语句变得简单。
LAST_INSERT_ID是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID返回表b中的Id值。