首页 > 解决方案 > Postgres 中列的时区值的默认时间戳无效

问题描述

我有一个具有以下结构的表:

   Column   |           Type           |  Default
------------+--------------------------+---------
 start_time | timestamp with time zone |
 end_time   | timestamp with time zone |
 created_at | timestamp with time zone | timezone('UTC'::text, now())

加上一些额外的字段

insert同样将数据放入表中(在 Java 中,使用 JDBC):

// INSERT statement
// INSERT INTO table (start_time, end_time) VALUES (?::timestamptz, ?::timestamptz);

// statement => PreparedStatement
// sample.start(), sample.end() => java.time.LocalDateTime
statement.setString(START_IDX, sample.start().format(DateTimeFormatter.ISO_DATE_TIME));
statement.setString(END_IDX, sample.end().format(DateTimeFormatter.ISO_DATE_TIME));

end_time和之间可接受的差异created_at应该是几秒钟。

但是现在当我查询数据时psql

-- LIMIT, ORDER BY removed for brevity
SELECT created_at, start_time, end_time FROM table

我得到结果

    created_at             |    start_time             |    end_time    
---------------------------+---------------------------+---------------
 2018-09-27 09:13:07+05:30 | 2018-09-27 14:42:00+05:30 | 2018-09-27 14:43:00+05:30

+05:30结尾不应该有a created_at!!!
我想这意味着 Postgres 将带有时区的时间戳视为它应该将它视为09:13:07at的位置!IST09:13:07UTC

这会破坏更多的东西!

所以,我的问题是,是什么导致了这个问题?它是一个错误(1%)吗?还是我错过了什么(99%)?

PS 我在 Windows 10 64 位并使用 Postgres 10.3

编辑(1):

该表创建为

CREATE TABLE behaviour_sample (
  sample        JSON NOT NULL,
  start_time    TIMESTAMPTZ NOT NULL,
  end_time      TIMESTAMPTZ NOT NULL,
  device        CHAR(16) REFERENCES device(eui) NOT NULL,
  created_at    TIMESTAMPTZ NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC')
);

编辑(2):

好的,所以我检查了我的其他表,他们也有类似的问题!

他们所有人的共同点是该created_at字段使用

created_at TIMESTAMPTZ NOT NULL DEFAULT (NOW() AT TIME ZONE 'UTC')

所以如果我创建一个记录,比如说,14:30:00 +05:30它会09:00:00 +05:30在查询时显示!时间在utc但有时区ist+05:30部分)

标签: sqlpostgresqltimestamptimestamp-with-timezone

解决方案


推荐阅读