数据库特别提供了对有关日期和时间数据的支持,从专门列出的date,datetime,timestamp数据类型就可以看出(对SQL数据类型想深入了解可以参考MySQL的数据类型),除了对时间日期数据类型的支持,SQL还提供了相关的日期函数供我们使用。常用日期函数如下:
1. current_date()
current_date()返回当前日期,包括年月日,与date数据类型对应,为了直观的显示出函数的功能,接下来的例子只演示函数直接使用的效果。
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2018-06-22 |
+----------------+
1 row in set (0.03 sec)
2. current_time()
current_time()返回当前的时间,包括时分秒,使用如下:
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 17:08:37 |
+----------------+
1 row in set (0.00 sec)
3. current_timestamp()
返回当前时间戳,MySQL会直接将时间戳转换为 年月日时分秒的格式,对应了datetime数据类型,使用如下:
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2018-06-22 17:10:15 |
+---------------------+
1 row in set (0.00 sec)
4. date(datetime)
将一个datetime类型的数据去掉时分秒,只保留年月日部分。
mysql> select date(current_timestamp());
+---------------------------+
| date(current_timestamp()) |
+---------------------------+
| 2018-06-22 |
+---------------------------+
1 row in set (0.03 sec)
5. date_add(date, interval value day_type)
date_add函数用来给date加上一个一个日期,date必须是一个date类型的年月日,interval为关键字,value为要加的日期值,day_type为日期值的单位,演示如下:
// 计算2018.6.23十天后的日期
mysql> select date_add(current_date, interval 1 day);
+----------------------------------------+
| date_add(current_date, interval 1 day) |
+----------------------------------------+
| 2018-06-23 |
+----------------------------------------+
1 row in set (0.03 sec)
注意,这里的添加的天数可以为负值,为负值的含义就是减去value。
6. date_sub(date, interval value day_type)
date_sub参数含义和使用方法与date_add一样,但是是给指定日期减伤value天,同理,value也可以为负值,为负值就是加上该天数。
7. datediff(date1, date2)
datediff函数试计算date1与date2之间的日期差,返回结果的单位为天,使用如下:
mysql> select datediff(current_date(), '2015-9-16');
+---------------------------------------+
| datediff(current_date(), '2015-9-16') |
+---------------------------------------+
| 1010 |
+---------------------------------------+
1 row in set (0.00 sec)
注意,这里返回的是date1减去date2的天数。要是date2比date1大,返回的是一个负数。
8. now()
顾名思义,now()函数返回当前年月日时分秒,与datetime类型对应,使用如下:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-06-22 17:25:33 |
+---------------------+
1 row in set (0.00 sec)
这就是SQL常用的日期函数,下面我们看一个简单的例子:
-- 创建一张生日表,并且插入今天作为生日数据
mysql> create database test;
Query OK, 1 row affected (0.05 sec)
mysql> use test;
Database changed
mysql> create table t1(id int primary key auto_increment, birthday date);
Query OK, 0 rows affected (0.98 sec)
mysql> insert into t1(birthday) values(current_date());
Query OK, 1 row affected (0.17 sec)
mysql> select * from t1;
+----+------------+
| id | birthday |
+----+------------+
| 1 | 2018-06-22 |
+----+------------+
1 row in set (0.00 sec)
接下来,我们看一个稍微复杂的例子:
-- 创建一张表示留言板的表
create table msg(
id int primary key auto_increment comment '用户id',
content varchar(30) not null comment '留言内容',
sendtime datetime comment '留言时间'
);
Query OK, 0 rows affected (0.78 sec)
-- 插入两条测试数据
mysql> insert into msg(content, sendtime) values('i am a', now()), ('i am b', '2018-1-1 0:0:0');
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from msg;
+----+---------+---------------------+
| id | content | sendtime |
+----+---------+---------------------+
| 1 | i am a | 2018-06-22 17:42:05 |
| 2 | i am b | 2018-01-01 00:00:00 |
+----+---------+---------------------+
2 rows in set (0.00 sec)
-- 查找十分钟之内发帖的用户
mysql> select * from msg where date_add(sendtime, interval 10 minute) < now();
+----+---------+---------------------+
| id | content | sendtime |
+----+---------+---------------------+
| 2 | i am b | 2018-01-01 00:00:00 |
+----+---------+---------------------+
1 row in set (0.03 sec)
上面的函数理解起来都很简单,但是大家不要抱着SQL也就不过如此的态度来学习,因为数据库真正的难点是在与各种各样的语句组合使用,那样才能发挥出这些语句的为例。在之后的章节里,可能随便一条查询语句都是两三行起步,所以在这之前,打好基础是非常重要的。