MySQL知识(六)——时间日期函数、系统信息函数

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值。

你可能感兴趣的:(mysql,数据库,函数,系统信息函数,时间日期函数)