关系数据库中的时区混淆

时间:2013-05-20 21:42:03

标签: mysql sql database postgresql

我已经下载了.sql格式的postgres数据库。数据库中时间列的类型是:带时区的时间戳。数据库中的日期以下面给出的形式提及:

 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”。这是这些时间代表的时区。我应该如何转换这些时间戳,以便用户可以轻松查询以找出出生日期,而不会对时区感到困惑。

2 个答案:

答案 0 :(得分:4)

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

MySQL 5.0及以上版本中的timestamp也是如此:
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

答案 1 :(得分:1)

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

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