美文网首页
MYSQL TIMESTAMP,DATETIME,DATE和IN

MYSQL TIMESTAMP,DATETIME,DATE和IN

作者: a564c12b3104 | 来源:发表于2018-05-08 13:57 被阅读186次

项目开发中,数据库设计一直都是比较纠结的问题,尤其是存储时间的字段。目前来说大部分的开源产品的数据库存储时间都是用 int类型存储时间戳,小部分是用DATE,DATETIME,TIMESTAMP之类的。非常流行的框架Laravel中数据迁移created_at以及updated_at默认是以TIMESTAMP存储。

INT

Int占据4个字节,以整形存储时间戳,建立索引之后,查询速度快,条件范围搜索可以使用使用between,不能使用mysql提供的时间函数。

应用场景:适合需要进行大量时间范围查询的数据表

DATE

Date只存储日期,不存储时间,也就是说比如今天2016-03-04,并不存储时分秒。MySQL 以 'YYYY-MM-DD' 格式检索与显示 DATE 值。支持的范围是 '1000-01-01' 到 '9999-12-31'

DATETIME

DateTime占据8个字节,Mysql以 YYYY-MM-DD HH:MM:SS 形式检索和显示datetime类型的数据,理论上存储的时间范围为 1000-01-01 00:00:00 到 9999-12-31 23:59:59

在创建或者修改表结构的语句中,如果我们,使用下面的语句,默认值为当前时间(更新表记录并不会修改该时间):

ALTER TABLE test ADD created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER updated_at;
假如,同样字段,我们修改给该字段赋予属性on update CURRENT_TIMESTAMP,则会在每次更新数据的时候自动更新修改时间:

ALTER TABLE test CHANGE created_at created_at DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
还有一个特性:与时区无关

应用场景:适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。

TIMESTAMP

新增timestamp 字段

alter table table_name add column created_at timestamp not null default CURRENT_TIMESTAMP;
TIMESTAMP占据4个字节,存储形式为 YYYYMMDDHHMMSS即以UTC形式存储 ,存储范围为1970-01-01 08:00:01到2038-01-19 11:14:07.超出这个值会被存储为0.可以设置字段的长度,设置字段的长度并不改变实际的值,但是会影响查询显示的结果。例如:

字段类型 显示格式 保存格式
TIMESTAMP(14) YYYY-MM-DD-HH-MM-SS YYYYMMDDHHMMSS
TIMESTAMP(12) YY-MM-DD-HH-MM-SS YYMMDDHHMMSS
TIMESTAMP(10) YY-MM-DD-HH-MM YYMMDDHHMM
TIMESTAMP(8) YY-MM-DD-HH YYMMDDHH
TIMESTAMP(6) YY-MM-DD YYMMDD
TIMESTAMP(4) YY-MM YYMM
TIMESTAMP(2) YY YY
如果在一张数据表中,有多个列是TIMESTAMP类型的,只有第一个会在每次更新记录的时候会自动更新时间,可以作为记录修改时间,其他的可以作为数据原始创建时间。

默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间

应用场景:适合记录数据的最后修改时间,只要有修改记录,就可以把时间保存下来,不需要你手工去记录。由于占用字节比较小,效率上也会高点,但是时间上的限制,不能超出2038年,不能早于1970年。

比较大的缺陷:TIMESTAMP比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响

虽然我们查询显示的格式类似于字符串,但是还是可以直接通过order 进行排序来实现简单的时间比较

各种场景不一样,可以选择适合的类型作为时间存储的列类型。

相关文章

网友评论

      本文标题:MYSQL TIMESTAMP,DATETIME,DATE和IN

      本文链接:https://www.haomeiwen.com/subject/xxairftx.html