У меня есть таблица со следующей структурой:
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())
плюс некоторые дополнительные поля .
I 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
в конце created_at
!!!
Полагаю, это означает, что Postgres обрабатывает метку времени с часовым поясом как 09:13:07
в IST
, где он должен обрабатывать ее как 09:13:07
в UTC
!!
И это ломает кучу вещей дальше по дороге!
Итак, мой вопрос, что является причиной этой проблемы?это ошибка (1%)?или я что-то упустил на моей стороне (99%)?
PS Я нахожусь на 64-битной Windows 10 и использую Postgres 10.3
EDIT (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')
);
Edit (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
)