时间类型选择
mysql本身支持的时间类型有:DATE,DATETIME,TIMESTAMP 三种(参考文档)
- TIMESTAMP MySQL 5.6.4版本之前,占4个字节,精度精确到秒,在MySQL 5.6.4及之后版本,可以将时间戳类型数据最高精确微秒(百万分之一秒),数据类型定义为timestamp(N),N取值范围为0-6,默认为0,如需要精确到毫秒则设置为Timestamp(3),如需要精确到微秒则设置为timestamp(6),数据精度提高的代价是其内部存储空间的变大,但仍未改变时间戳类型的最小和最大取值范围。
- DATETIME类型占用8个字节空间(秒级精度),可以存储的范围较大'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999',与TIMESTAMP不同的是,DATETIME存储的格式是字面上的时间,而不是时间戳,如果考虑全球化业务的话可能容易遇到问题。
- 用int类型存储精度到秒的时间,最大可以表示的时间为'2038/1/19 11:14:7';同unsigned int存储的话,最大可以表示的时间为'2106/2/7 14:28:15'。同样要谨慎使用。
- DATE精度到天,一般较少使用。
各类型时间范围
1.DATE、DATETIME和TIMESTAMP 表达的时间范围
Type | Range | Remark |
---|---|---|
DATE | '1000-01-01' to '9999-12-31' | 只有日期部分,没有时间部分 |
DATETIME | '1000-01-01 00:00:00' to '9999-12-31 23:59:59' | 时间格式为 YYYY-MM-DD hh:mm:ss,默认精确到秒 |
TIMESTAMP | '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07'UTC | 默认精确到秒 |
2.DATETIME和TIMESTAMP 最大时间精确度
5.7 之后的版本(其实应该说5.6.5),在默认的秒精确度上,可以带小数,最多带6位小数,即可以精确到 microseconds (6 digits) precision。
Type | Range | Remark |
---|---|---|
DATETIME | '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999' | 'YYYY-MM-DD hh:mm:ss[.fraction]' |
TIMESTAMP | '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999' | 'YYYY-MM-DD hh:mm:ss[.fraction]' |
3.DATETIME和TIMESTAMP 区别
(1) 时间范围不一样,TIMESTAMP 要小很多 ,且最大范围为2038-01-19 03:14:07.999999,到期也不远了。
(2)对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。