您的位置:首页 > 数据库 > MySQL

MySQL日期和时间类型

2016-02-26 20:46 691 查看
MySQL
数据库中有五种与日期和时间有关的数据类型,如下表所示

类型所占空间
DATETIME8字节
DATE3字节
TIMESTAMP4字节
TEAR1字节
TIME3字节

DATETIME
DATE

DATETIME
占8个字节,表示的日期范围为
1000-01-01 00:00:00
9999-12-31 23:59:59


DATE
占3个字节,表示的日期范围为
1000-01-01
9999-12-31


MySQL
对日期和时间的输入格式要求非常宽松,以下都被视为日期类型

2016-02-24 21:05:00


2016/02/24 21+05+00


20160224210500


16/02/24 21@05@00
PS:注意这里的
16
是最近的
2016
而不是其他的
1916


MySQL5.5
及之前的版本的数据库的日期类型不能精确到秒,不过
MySQL5.6.4
版本开始增加了对秒的小数部分的支持,具体语法为:

type_name(fsp)


type_name
可以是
TIME
DATETIME
TIMESTAMP
fsp
表示支持的小数部分的精度,最大为
6
,表示微秒,默认为
0
。对于时间函数,如
CURTIME()
SYSDATE()
UTC_TIMESTAMP()
也增加了对
fsp
的支持。

mysql> create table t( a DATETIME(2), b DATETIME);
mysql> insert into t values('2016-02-24 21:27:6.5645', '2016-02-24 21:27:6.5645');
mysql> select * from t;
+------------------------+---------------------+
| a                      | b                   |
+------------------------+---------------------+
| 2016-02-24 21:27:06.56 | 2016-02-24 21:27:57 |
+------------------------+---------------------+


TIMESTAMP

TIMESTAMP
DATETIME
显示的结果一样,都是
YYYY-MM-DD HH:MM:SS
。不同的是
TIMESTAMP
4
个字节,显示的范围为
1970-01-01 00:00:00UTC
2038-01-19 03:14:07UTC
,其实际存储的是
1970-01-01 00:00:00
到当前的毫秒数。

TIMESTAMP
DATETIME
除了上述的不同点之外还有以下的不同点:

1.建表时,
TIMESTAMP
类型的列可以设置默认值,而
DATETIME
不行。

2.更新时,可以设置
TIMESTAMP
类型的列自动更新时间为当前时间。如果更新前后的数据没有改变,那么
TIMESTAMP
的值也不会改变。

默认设置时间的例子:

mysql> create table t( a INT, b TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
mysql> insert into t(a) values(1);
mysql> select * from t;
+------+---------------------+
| a    | b                   |
+------+---------------------+
|    1 | 2016-02-24 22:03:13 |
+------+---------------------+


更新为当前时间的例子:

mysql> create table t (a INT,b TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t(a) values(1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t;
+------+---------------------+
| a    | b                   |
+------+---------------------+
|    1 | 2016-02-24 22:26:22 |
+------+---------------------+
1 row in set (0.00 sec)
mysql> update t set a=2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from t;
+------+---------------------+
| a    | b                   |
+------+---------------------+
|    2 | 2016-02-24 22:27:12 |
+------+---------------------+
1 row in set (0.00 sec)
mysql> update t set a=2;
mysql> select * from t;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
+------+---------------------+
| a    | b                   |
+------+---------------------+
|    2 | 2016-02-24 22:27:12 |
+------+---------------------+
1 row in set (0.00 sec)


YEAR
TIME

YEAR
:其显示年份范围为
1901
2155
,其中之前的
YEAR(2)
mysql5.5.27
及之后的版本中废弃掉了。

TIME
类型占
3
个字节,显示的范围为
-838:59:59
838:59:59


与日期和时间相关的函数

NOW
CURRENT_TIMESTAMP
SYSDATE

mysql> select now(), current_timestamp(), sysdate(), sleep(2), now(), current_timestamp(), sysdate();
+---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+
| now()               | current_timestamp() | sysdate()           | sleep(2) | now()               | current_timestamp() | sysdate()           |
+---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+
| 2016-02-26 20:01:58 | 2016-02-26 20:01:58 | 2016-02-26 20:01:58 |        0 | 2016-02-26 20:01:58 | 2016-02-26 20:01:58 | 2016-02-26 20:02:00 |
+---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+
1 row in set (2.00 sec)


注意上面返回的区别:

CURRENT_TIMESTAMP
NOW
的同义词,两者是一样的。

SYSDATE
函数返回的是执行到当前函数的时间,而
NOW
返回的是执行
SQL
语句的时间。因此才有了上面的结果。

时间加减函数

时间加减函数有
DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
,示例如下:

mysql> select now() as now,
-> date_add(now(), interval 1 day) as tomorrow,
-> date_sub(now(), interval 1 day) as yesterday;
+---------------------+---------------------+---------------------+
| now                 | tomorrow            | yesterday           |
+---------------------+---------------------+---------------------+
| 2016-02-26 20:11:52 | 2016-02-27 20:11:52 | 2016-02-25 20:11:52 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)


上面的例子中的
unit
除了使用
DAY
之外,还可以使用
YEAR
MICROSECOND
SECOND
MINUTER
HOUR
WEEK
MONTH
等类型。

DATE_FORMAT函数

这个函数本身没有好探讨的,其示例如下所示: [code]mysql> select date_format(now(), '%Y%m%d') as datetime; +----------+ | datetime | +----------+ | 20160226 | +----------+ 1 row in set (0.00 sec)

但是开发人员往往会错误地使用这个函数,导致非常严重的后果。例如:

select * from table where date_format(date, '%Y%m%d') = 'XXXX-XX-XX';


一般表都会有一个对日期类型的索引,如果使用了上述的语句,优化器绝对不会使用索引,也不可能通过索引来查询函数,因此上述查询的执行效率可能非常底。最后一句看不懂

摘抄文献

《MySQL技术内幕:SQL编程》
作者:
姜承尧(DavidJiang)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql timestamp