MYSQL数据库date, datatime,timestamp区别在哪?

我们在建立数据库表结构时候,不可避免的需要增加时间字段,一直以来 我所在的公司都习惯于使用INT型时间戳去记录时间,但是Laravel 框架默认使用timestamp来记录时间。今天咱们就来 探究一下几个时间类型之间的区别。

date 1000-01-01 至 9999-12-31 只有日期,没有时间
datatime 1000-01-01 00:00:00至 9999-12-31 23:59:59 时间格式 YY-mm-dd hh:mm:ss,默认精确到秒
timestamp 1970-01-01 00:00:00 UTC至 2038-01-19 03:14:07 UTC 同上

总表格中,可以看出,他们在时间范围以及格式上的不同,现在新建2张表


CREATE TABLE `test`(

 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
 `create_at`TIMESTAMP,
 PRIMRY KEY(`id`)   
) ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='表1';



CREATE TABLE `test1`(

 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
 `create_at`DATETIME,
 PRIMRY KEY(`id`)   
) ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='表2';

 1.当新增时间 2050年时间时候

insert test (id,create_at) VALUES(2,'2050-09-18 00:00:00');

insert test1 (id,create_at) VALUES(2,'2050-09-18 00:00:00');

 我们会看到 test表是无法存储的,会提示

Incorrect datetime value: '2050-09-18 00:00:00' for column 'create_at' at row 1

但是test1可以成功存储,这也是因为时间范围原因导致的。

2.时区处理不同

对于timestamp ,他将客户端插入的时间从当前时区转换为UTC进行存储,查询时候,又将其转换为客户端时间进行返回。而对于datetime,不做任何改变,基本上是原样输入和输出。

我们先看一下当前服务器时区

show VARIABLES like "%time_zone%"

结果

MYSQL数据库date, datatime,timestamp区别在哪?

我们看一下没修改时区之前的查询结果:

MYSQL数据库date, datatime,timestamp区别在哪?

都是表里面存储的9月18日

下面我们修改一下时区

 MYSQL数据库date, datatime,timestamp区别在哪?

MYSQL数据库date, datatime,timestamp区别在哪? 

 MYSQL数据库date, datatime,timestamp区别在哪?

 我看看到test表的 creat_at字段 查询结果已经是 9月17了,而test1表数据并没有改变。

我想应该是Laravel是一个外国人开发的框架,并且在世界范围内使用这都很多,所以使用了timestamp 以方便时区问题解决。

 

上一篇:linux测试umask


下一篇:Python DataTime 日期处理