关系数据库中的时区混淆

Posted

技术标签:

【中文标题】关系数据库中的时区混淆【英文标题】:time zone confusion in relational databases 【发布时间】:2013-05-20 21:42:03 【问题描述】:

我已经下载了一个 .sql 格式的 postgres 数据库。数据库中时态列的类型为:timestamp with time zone。日期在数据库中以下列形式提及:

 1866-05-17 05:53:28+05:53:28
 1901-09-28 05:53:20+05:53:20
 1960-01-01 05:30:00+05:30
 1944-07-21 06:30:00+06:30

现在我无法解释是什么意思:例如“05:53:28+05:53:28”。这就是这些时间所代表的时区。以及我应该如何转换这些时间戳,以便用户可以轻松查询以找出一个人的出生日期,而不会对时区感到困惑。

【问题讨论】:

【参考方案1】:

在 PostgreSQL 中,您不必担心奇怪的时区偏移。在内部,对于 timestamp with time zone(简称 timestaptz),仅存储自 UTC 时区“1970-01-01”以来的秒数。

timestampmysql 5.0 及更高版本中也是如此:Should I use field 'datetime' or 'timestamp'?

如果您只对date 感兴趣,您可能希望将列从timestamptz 转换为date。在 Postgres 中,当转换为 date 时,将应用 local 时区。试试:

SELECT '2013-05-21 00:19:50+02'::timestamptz::date

奇怪的时区偏移是由于 20 世纪初之前的“平均太阳时”等历史上不同的制度。我们最近有一个类似的问题,我回答了一个解释:PostgreSql: Getting strange-formated "timestamp with time zone"

Postgres 数据类型timestamptimestamptz 的更多解释:Ignoring timezones altogether in Rails and PostgreSQL

【讨论】:

【参考方案2】:

“05:53:28+05:53:28”表示时间05:53:28 比UTC 早5 小时53 分28 秒。换句话说,那个时间是 UTC 午夜。请注意,没有与 UTC 偏移 5:53:28 的实际时区。大多数时区与 UTC 有整小时的偏移,少数时区偏移半小时,甚至更少(只有一小手已满)四分之一小时。

事实上,您提供的每个采样时间都是 UTC 午夜,在不同的历史日期。

【讨论】:

以上是关于关系数据库中的时区混淆的主要内容,如果未能解决你的问题,请参考以下文章

理解python中的对象关系(混淆)[重复]

VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里

什么是时区?时区与日期有什么关系?

PostgreSQL表空间数据库模式表用户/角色之间的关系

单例模式与多线程之间的关系总结

gettimeofday函数与时区的关系 & 时区的修改