Неверная временная метка по умолчанию со значением часового пояса для столбца в Postgres - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть таблица со следующей структурой:

   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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...