1

我有一个具有以下架构的 PostgreSQL 表 -

CREATE TABLE test (
  id serial NOT NULL PRIMARY KEY,
  username varchar(100) NOT NULL, -- The user name
  dob timestamp with time zone NOT NULL -- The date of birth
);

然后我用这样的数据将一些数据插入到表中 -

INSERT INTO "test" ("username", "dob") VALUES (E'Scotty', E'2009-05-14 15:44:43');

如果我检查数据库中的数据,我会得到这个 -

mydb=> select username, dob from test where username='Scotty';
 username |            dob            
----------+---------------------------
 Scotty   | 2009-05-14 15:44:43+05:30
(1 row)

在我尝试插入一些日期为 1946 年之前的数据之前,一切都很好而且很花哨 -

INSERT INTO "test" ("username", "dob") VALUES (E'James T Kirk', E'1945-01-01 11:30:11');

mydb=> select username, dob from test where username='James T Kirk';
      username |            dob            
-------------- +---------------------------
 James T Kirk  | 1945-01-01 11:30:11+06:30
(1 row)

看看上面的结果。请注意时区值如何从 +05:30 更改为 +06:30

当我插入 1942 年之前的任何日期时,它实际上会变得更糟 -

INSERT INTO "test" ("username", "dob") VALUES (E'Spock', E'1941-01-01 11:30:11');

mydb=> select username, dob from test where username='Spock';
 username |             dob              
----------+------------------------------
 Spock    | 1941-01-01 11:30:11+05:53:20
(1 row)

现在时区值已完全损坏,无法解析日期。

我将不胜感激。

我的时区是亚洲/加尔各答 (GMT+05:30)。

更新:我尝试通过像这样明确指定 TZ 来输入数据 -

INSERT INTO "test" ("username", "dob") VALUES (E'McCoy', E'1941-01-25 00:20:30+05:30');

即使那样也没有用。

mydb=> select username, dob from test where username='McCoy';
 username |             dob              
----------+------------------------------
 McCoy    | 1941-01-25 00:43:50+05:53:20
(1 row)
4

3 回答 3

3

在哪个地区?可能 PostgreSQL 假设日期适用于您当前的语言环境,并应用适当的时区和 DST 规则,如果日期和时间是(比如)UTC,那么这不是正确的做法。

你真的需要时区功能吗?Atimestamp without time zone将表现出更理智的行为,因为它不必实施奇怪的规则。但是,如果您需要时区,那么您肯定想解决这个问题而不是混淆它。

最好的解决方法是明确指定时区:'04:05:06-08:00'对于 GMT–08:00,或者'04:05:06z'对于 GMT/UTC/"Zulu"(因此是 'z')。

编辑:大部分真正的怪异来自亚洲/加尔各答时区。来自tzdata2009g

# India
# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Asia/Kolkata    5:53:28 -   LMT 1880    # Kolkata
            5:53:20 -   HMT 1941 Oct    # Howrah Mean Time?
            6:30    -   BURT    1942 May 15 # Burma Time
            5:30    -   IST 1942 Sep
            5:30    1:00    IST 1945 Oct 15
            5:30    -   IST

你没有描述你期望的行为是什么,所以很难说你想从这里去哪里。

于 2009-05-14T11:17:17.757 回答
1

这看起来像夏令时问题。(据我所知,时区是 UTC+05.30,DST 设置在 3 月/4 月左右,增加一小时)。

您是否尝试过插入相同的日期并更改年份以排除这种可能性?

对于最后一个,这很奇怪。我没有设法重现它,但这可能是因为半小时区。改变TZ环境变量是不是也一样?

于 2009-05-14T11:06:05.990 回答
0

我有一个类似但不同的问题。我们在 WinXP 上安装了 PostgreSQL8.0。

  1. 其中一列是带有 TimeZone 的 TimeStamp 类型。此列的时间值随着系统时区的变化而变化。我们能避免这种情况吗?
  2. 每次从表中检索后,每个元组都有半小时到达该列。

我无法追踪这个问题的根源。


rgds nithin

于 2009-08-04T08:31:17.340 回答