大家数据库时区字段用的是 utc,还是本地,还是时间戳呢
之前我都是用本地时间,但是曾经出过一次错,存了 utc 时间到数据库里面去了,导致我对本地时间有点怕怕的,而且存本地时间,好像需要更改服务器时区设置,好像是的
但是使用 utc, 有点问题
day
,那就是本地时间的了,这个样子有点郁闷呀
如果不使用统计表的方式,好像 sql 写起来会相当复杂呀!! 1
fuyufjh 2020-01-30 21:36:01 +08:00 1
大多数数据库都提供了两种列类型:自带时区和不带时区的时间戳,比如:
MySQL:DATETIME (自带时区)和 TIMESTAMP (不带时区) PostgresQL:TIMESTAMP WITH TIME ZONE (自带时区)和 TIMESTAMP (不带时区) 所谓自带时区,就是数据库不会帮你做额外的转换,你写入什么时间,读出来就是什么时间 所谓不带时区,就是数据库实际上会保存 UTC 时间戳,写入的时候先按 Session 时区转成 UTC 时间,读出的时候再按 Session 时区转成当前时区的时间,这些转换都是透明的 总结一下,你的这个需求,应该用不带时区的时间戳作为列类型,然后一切就搞定了 |
7
Mithril 2020-01-30 22:12:26 +08:00
@chenqh 如果你觉得以后会支持前端跑在不同时区,比如从国外访问,那你数据库就存 UTC。
查询的时候让前台给你传 UTC 时间。或者只存个 offset。 一般这些 ORM 都可以给你做了,配置一下就好了。 如果你这个产品从头到尾都不会有人在不同时区使用,那就直接本地时间也没问题。 |
9
suotm 2020-01-30 22:23:09 +08:00
存成 unix 时间戳
|
11
chenqh OP 突然发现一个问题,v2ex 的东 8 区时间,好像差了几分钟
|
14
keepeye 2020-01-31 09:18:32 +08:00 1
客户端连接数据库之后,设置本次连接的时区,这样 timestamp 字段读写就能自动转换了
SET time_zone = timezone; |
15
optional 2020-01-31 09:36:54 +08:00 1
@chenqh 如果是 PG,设置客户端的连接时区, 所有 timestamp with time zone 都会自动按照设置的时区处理时间。
|
17
bjking2014 2020-01-31 10:47:39 +08:00 via Android
我们有澳洲,香港,英国的项目,都是用的 datetime 类型
|
18
keepeye 2020-01-31 11:03:34 +08:00
@chenqh 不太明白你纠结的点在哪里,如果是不知道怎么聚合查询的话,可以这样写 where DATE(created_at) = 'xxxx-xx-xx'
|
19
eason1874 2020-01-31 11:11:19 +08:00
我直接存 int 只由代码处理时区。
|
20
ellermister 2020-01-31 11:36:26 +08:00 via Android
我也比较好奇这个问题,已经好久没有用时间类型了,一直是 int 存储。
|
21
optional 2020-01-31 11:47:02 +08:00
@keepeye 他纠结的问题就在这里,如果 created_at 不带时区的话,不能按照 local date 的方式统计。
|
23
keepeye 2020-01-31 12:50:57 +08:00
不信就做个试验吧,可能很多人还不理解 connection 可以设置时区
mysql> select created_at from users limit 1; +---------------------+ | created_at | +---------------------+ | 2019-03-01 02:14:53 | +---------------------+ 1 row in set (0.00 sec) mysql> set time_zone='-8:00'; Query OK, 0 rows affected (0.00 sec) mysql> select created_at from users limit 1; +---------------------+ | created_at | +---------------------+ | 2019-02-28 10:14:53 | +---------------------+ 1 row in set (0.00 sec) mysql> select date(created_at) from users limit 1; +------------------+ | date(created_at) | +------------------+ | 2019-02-28 | +------------------+ 1 row in set (0.00 sec) |
25
chenqh OP @keepeye 之前都不知知道 connection 可以设置时区,但是我想了一下,有一个问题,使用了带时区的 connection,insert 或者 update 的时候, 时间必须是本地时间?
|