不要用字符串存储日期
- 占用的空间更大!
- 无法用日期相关的 API 进行计算和比较。 3. 比如寻找每个周日的数据,就会很麻烦
Datetime 和 Timestamp
时区信息
- DateTime没有,不同时区读取到的时间一样(不会根据地区进行相应的转换)
- Timestamp有,不同时区读取到转换后的值(不一样)
占用空间
- DateTime 的范围是 5~8 字节
- Timestamp 的范围是 4~7 字节。
表示范围
- DateTime:1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999
- Timestamp:1970-01-01 00:00:01.000000 ~ 2038-01-19 03:14:07.499999
性能
- TIMESTAMP 需要根据时区进行转换,效率较低
- DATETIME 不涉及时区转换,所以不会有这个问题。
数值时间戳是更好的选择吗?
很多时候,我们也会使用 int 或者 bigint 类型的数值也就是数值时间戳来表示时间。
这种存储方式的具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,毕竟只是存放的数值。缺点也很明显,就是数据的可读性太差了,你无法直观的看到具体时间。
| 类型 | 存储空间 | 日期格式 | 日期范围 | 是否带时区信息 |
|---|---|---|---|---|
| DATETIME | 5~8 字节 | YYYY-MM-DD hh:mm:ss[.fraction] | 1000-01-01 00:00:00[.000000] ~ 9999-12-31 23:59:59[.999999] | 否 |
| TIMESTAMP | 4~7 字节 | YYYY-MM-DD hh:mm:ss[.fraction] | 1970-01-01 00:00:01[.000000] ~ 2038-01-19 03:14:07[.999999] | 是 |
| 数值型时间戳 | 4 字节 | 全数字如 1578707612 | 1970-01-01 00:00:01 之后的时间 | 否 |
