作者:zhuzhichao
链接:https://learnku.com/laravel/t…
构建数据库写程序防止不了应用日期和工夫,对于数据库来说,有多种日期工夫字段可供选择,如 timestamp 和 datetime 以及应用 int 来存储 unix timestamp。
不仅老手,包含一些有教训的程序员还是比拟迷茫,到底我该用哪种类型来存储日期工夫呢?
那咱们就一步一步来剖析他们的特点,这样咱们依据本人的需要抉择适合的字段类型来存储 (长处和毛病是比拟进去的 , 跟父母从小喜爱拿街坊小孩子跟本人比一样的)
datetime 和 timestamp
datetime 更像日历下面的工夫和你手表的工夫的联合,就是指具体某个工夫。
timestamp 更适宜来记录时间,比方我在东八区工夫当初是 2016-08-02 10:35:52,你在日本(东九区此时工夫为 2016-08-02 11:35:52),我和你在聊天,数据库记录了工夫,取出来之后,对于我来说工夫是 2016-08-02 10:35:52,对于日本的你来说就是 2016-08-02 11:35:52。所以就不必思考时区的计算了。
工夫范畴是 timestamp 硬伤(1970-2038),当然 datetime(1000-9999)也记录不了刘备什么时候出世(161 年)。
timestamp 和 UNIX timestamp
显示直观,出问题了便于排错,比好多很长的 int 数字难看多了
int 是从 1970 年开始累加的,然而 int 反对的范畴是 1901-12-13 到 2038-01-19 03:14:07,如果须要更大的范畴须要设置为 bigInt。然而这个工夫不蕴含毫秒,如果须要毫秒,还须要定义为浮点数。datetime 和 timestamp 原生自带 6 位的微秒。
timestamp 是自带时区转换的,同下面的第 2 项。
用户前端输出的工夫个别都是日期类型,如果存储 int 还须要存前取后处理
总结
timestamp 记录常常变动的更新 / 创立 / 公布 / 日志工夫 / 购买工夫 / 登录工夫 / 注册工夫等,并且是近来的工夫,够用,时区主动解决,比如说做海内购或者业务可能拓展到海内
datetime 记录固定工夫如服务器执行打算工作工夫 / 健身锤炼打算工夫等,在任何时区都是须要一个固定的工夫要做某个事件。超出 timestamp 的工夫,如果须要时区必须记得时区解决
UNIX timestamps 应用起来并不是很不便,至于说比拟取范畴什么的,timestamp 和 datetime 都无能。
如果你不思考时区,或者有本人一套的时区计划,随便了,喜爱哪个上哪个了,当然,你能够关注公众号 Java 技术栈回复 m36 获取一份 MySQL 开发军规。
laravel 是国际化设计的框架,为了程序员不便、合乎数据库设计标准,所以 created_at updated_at 应用了 timestamp 是无可非议的。
有没有一个工夫类型即解决了范畴、时区的问题?这是不可能的,不是还有 tinyInt BigInt 吗?取本人所需,并且 MySQL 是容许数据库字段变更的。
生日能够应用多个字段来存储,比方 year/month/day,这样就能够很不便的找到某天过生日的用户 (User::where(\['month' => 8, 'day' => 12\])->get()
)
构建我的项目的时候须要认真思考一下,本人的业务场景到底用哪种更适宜。选哪个?需要来定。关注公众号 Java 技术栈回复 m36 能够获取一份 MySQL 开发军规。
欢送大家补充和斧正。