关于数据库时间字段的时区问题

2020-01-30 21:20:07 +08:00
 chenqh

大家数据库时区字段用的是 utc,还是本地,还是时间戳呢
之前我都是用本地时间,但是曾经出过一次错,存了 utc 时间到数据库里面去了,导致我对本地时间有点怕怕的,而且存本地时间,好像需要更改服务器时区设置,好像是的
但是使用 utc, 有点问题

  1. 渲染的时候需要加偏移(这只是麻烦点)
  2. 就是统计的问题了,如果是按天的统计表,那么这个统计表的day,那就是本地时间的了,这个样子有点郁闷呀 如果不使用统计表的方式,好像 sql 写起来会相当复杂呀!!
6440 次点击
所在节点    MySQL
28 条回复
fuyufjh
2020-01-30 21:36:01 +08:00
大多数数据库都提供了两种列类型:自带时区和不带时区的时间戳,比如:
MySQL:DATETIME (自带时区)和 TIMESTAMP (不带时区)
PostgresQL:TIMESTAMP WITH TIME ZONE (自带时区)和 TIMESTAMP (不带时区)
所谓自带时区,就是数据库不会帮你做额外的转换,你写入什么时间,读出来就是什么时间
所谓不带时区,就是数据库实际上会保存 UTC 时间戳,写入的时候先按 Session 时区转成 UTC 时间,读出的时候再按 Session 时区转成当前时区的时间,这些转换都是透明的
总结一下,你的这个需求,应该用不带时区的时间戳作为列类型,然后一切就搞定了
chenqh
2020-01-30 21:37:46 +08:00
@fuyufjh 使用 utc 的时候,统计的逻辑会复杂很多呀
fuyufjh
2020-01-30 21:38:30 +08:00
@chenqh “这些转换都是透明的”
chenqh
2020-01-30 21:45:40 +08:00
@fuyufjh 没有搞懂, 假如我想统计这个月每天的订单数目,这个天肯定是我本地时间的天呀
noqwerty
2020-01-30 21:56:01 +08:00
@chenqh UTC 转本地时间还嫌麻烦吗老哥…
Hellert
2020-01-30 22:02:11 +08:00
@fuyufjh 说反了吧?
Mithril
2020-01-30 22:12:26 +08:00
@chenqh 如果你觉得以后会支持前端跑在不同时区,比如从国外访问,那你数据库就存 UTC。
查询的时候让前台给你传 UTC 时间。或者只存个 offset。
一般这些 ORM 都可以给你做了,配置一下就好了。
如果你这个产品从头到尾都不会有人在不同时区使用,那就直接本地时间也没问题。
chenqh
2020-01-30 22:12:35 +08:00
@noqwerty 只是一点点麻烦而已,关键是统计的时候
suotm
2020-01-30 22:23:09 +08:00
存成 unix 时间戳
chenqh
2020-01-30 23:28:27 +08:00
@suotm 那统计表的按天统计怎么办? 使用时间戳或者 utc,居然会导致数据库里面存在两种时区?
chenqh
2020-01-30 23:34:34 +08:00
突然发现一个问题,v2ex 的东 8 区时间,好像差了几分钟
chenqh
2020-01-30 23:36:40 +08:00
@chenqh 看错了
DonaldY
2020-01-31 03:35:26 +08:00
@fuyufjh 这里的数据库隐式转换,包括驱动吗?
keepeye
2020-01-31 09:18:32 +08:00
客户端连接数据库之后,设置本次连接的时区,这样 timestamp 字段读写就能自动转换了
SET time_zone = timezone;
optional
2020-01-31 09:36:54 +08:00
@chenqh 如果是 PG,设置客户端的连接时区, 所有 timestamp with time zone 都会自动按照设置的时区处理时间。
chenqh
2020-01-31 10:31:30 +08:00
@keepeye 但是统计呢?
bjking2014
2020-01-31 10:47:39 +08:00
我们有澳洲,香港,英国的项目,都是用的 datetime 类型
keepeye
2020-01-31 11:03:34 +08:00
@chenqh 不太明白你纠结的点在哪里,如果是不知道怎么聚合查询的话,可以这样写 where DATE(created_at) = 'xxxx-xx-xx'
eason1874
2020-01-31 11:11:19 +08:00
我直接存 int 只由代码处理时区。
ellermister
2020-01-31 11:36:26 +08:00
我也比较好奇这个问题,已经好久没有用时间类型了,一直是 int 存储。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX