MySQL存时间,到底该用timestamp还是datetime?那种用的多啊

MySQL存时间,到底该用timestamp还是datetime?之前我都是用的timestamp,新来的队友建表字段都用的datetime。我有点怀疑自己了!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

如果你需要考虑时区,就推荐 timestamp ,如果不需要,就可以 datetime 。

再补充一个 timestamp 的优势

  • timestamp 列的默认值可以设置为 ON UPDATE CURRENT_TIMESTAMPDEFAULT CURRENT_TIMESTAMP ,分别表示在 更新和插入是更新这个字段的时间。

另外,不要被 timestamp 这个类型名字给骗了,虽然类型叫 timestamp ,实际上是指底层存储是使用的 timestamp(数字),实际上大部分 MySQL 客户端读取出来也是按照格式化时间字符串显示的,也是比较可读的。

另外需要注意的是,在插入的时候,也是按照格式化时间字符串插入的,而不是插入一个时间戳。

补充一个 datetime 的优势

timestamp 因为是使用的时间戳,所以时间范围是 1970 ~ 2038,如果你需要的时间范围不在这个范围内,那最好采用 datetime。

2038 问题,大可不必担心。 如果你需要存储未来的时间(超过 2038),可能需要 datetime

另外很多文章会告诉你, datetime 的存储长度是 8 ,timestamp 是 4 ,实际上在 5.6.4 版本以后,他们的差距就小了。
file

1年前 评论
还不出来 1年前
bing (楼主) 1年前
Rache1 (作者) 1年前
sunrain 1年前
讨论数量: 22

如果你需要考虑时区,就推荐 timestamp ,如果不需要,就可以 datetime 。

再补充一个 timestamp 的优势

  • timestamp 列的默认值可以设置为 ON UPDATE CURRENT_TIMESTAMPDEFAULT CURRENT_TIMESTAMP ,分别表示在 更新和插入是更新这个字段的时间。

另外,不要被 timestamp 这个类型名字给骗了,虽然类型叫 timestamp ,实际上是指底层存储是使用的 timestamp(数字),实际上大部分 MySQL 客户端读取出来也是按照格式化时间字符串显示的,也是比较可读的。

另外需要注意的是,在插入的时候,也是按照格式化时间字符串插入的,而不是插入一个时间戳。

补充一个 datetime 的优势

timestamp 因为是使用的时间戳,所以时间范围是 1970 ~ 2038,如果你需要的时间范围不在这个范围内,那最好采用 datetime。

2038 问题,大可不必担心。 如果你需要存储未来的时间(超过 2038),可能需要 datetime

另外很多文章会告诉你, datetime 的存储长度是 8 ,timestamp 是 4 ,实际上在 5.6.4 版本以后,他们的差距就小了。
file

1年前 评论
还不出来 1年前
bing (楼主) 1年前
Rache1 (作者) 1年前
sunrain 1年前

timestamp支持的范围是1970-01-01 00:00:012038-01-19 03:14:07

datetime支持的日期范围是 从0000-00-00 00:00:009999-12-31 23:59:59

1年前 评论
小李世界 1年前
canbez (作者) 1年前

没啥太大的 区别吧 2038你在哪都不知道

1年前 评论
fatrbaby

我都是用int的 :joy:

1年前 评论

建议改成int哦

1年前 评论
她来听我的演唱会 1年前
Smilephp (作者) 1年前
Jyunwaa

unsigned int

1年前 评论

不要用int,浪费空间不说,可读性也不好,程序查询、储存还要多一层转换

1年前 评论

数据产生时间用 timestamp,业务时间使用 datetime

1年前 评论
jdzor 1年前
DonnyLiu

亲,这边建议改成int unsigned哦

1年前 评论

就像上面的老哥说的,考虑时区的话使用timesteamp类型,但是最大年份就到2038年,这个是因为int(有符号)的取值范围: -2^31——2^31-1,即-2147483648——2147483647,取正整数换算成时间就是2038-01-19 11:14:07(timesteamp的翻译是时间戳)。因此建议使用无符号的int类型(unsigned int),可以转换成y-m-d h:i:s格式,还能考虑到时区的问题,最关键的可以用到下个世纪——无符号情况下int范围为0~4294967295,换算成时间就是:2106-02-07 14:28:15。

1年前 评论

timesteamp 因为项目到不了2038那天

1年前 评论
AbelZou 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!