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

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前

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