sql - 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:07
at的位置!IST
09:13:07
UTC
这会破坏更多的东西!
所以,我的问题是,是什么导致了这个问题?它是一个错误(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
部分)
解决方案
推荐阅读
- vue.js - Vue 动态 v-model 生成具有空值的额外数组项
- javascript - 带有 Javascript 的 Dot Net Core Web API - CORS 策略错误
- javascript - 有没有办法使用 .filter() 来获取 Javascript 数组中最后 X 个元素/索引?
- python - np.convolve 与 10**9 有什么问题?
- twitter - 使用 twitter api 获取特定 hastag 的所有推文
- python - 我在哪里可以下载股票隐含波动率数据?
- database - APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”
- java - rxjava中filterWhen的等价物
- python - 管道仅在直接运行脚本时有效(使用shebang)?
- android - 如何在音频播放器代码 Kotlin 中使用 LifecycleScope/Coroutine 而不是处理程序