PostgreSQL select now () :: timestamp отличается от значения по умолчанию now () :: timestamp - PullRequest
0 голосов
/ 30 ноября 2018

В моей программе у каждой таблицы есть столбец last_modified:

last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp) * (1000)::double precision) NOT NULL

Для обновления я добавил триггер:

CREATE OR REPLACE FUNCTION sync_lastmodified() RETURNS trigger AS $$
BEGIN
  NEW.last_modified := (date_part('epoch'::text, now()::timestamp) * (1000)::double precision);

  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER
  sync_lastmodified
BEFORE UPDATE ON
  ourtable
FOR EACH ROW EXECUTE PROCEDURE
  sync_lastmodified();

Они должны записать текущее время как длинное значение встолбец last_modified при обновлении / вставке.Однако, это не работает, как я ожидал.

Чтобы воспроизвести проблему, я обновил ее и получил следующее:

last_modified value equals 1543576224455 (Friday November 30, 2018 16:10:24 (pm) in time zone Asia/Tashkent (+05))

Почти одновременно я запускаю функцию nowот pgAdmin:

SELECT now()

и получил результат:

2018-11-30 11:10:36.891426+05

Для проверки системного времени в течение нескольких секунд я запускаю timedatectl status из терминала и получаю следующий результат:

enter image description here

Вопрос в том, почему функция now () дает время с разницей в 5 часов при запуске из триггера или в качестве значения по умолчанию при вставке?

1 Ответ

0 голосов
/ 30 ноября 2018

epoch даст вам количество секунд с начала эпохи.Как документация гласит:

epoch

Для значений timestamp with time zone количество секунд с 1970-01-01 00:00:00UTC (может быть отрицательным)

Поскольку вы смещены на 5 часов от UTC, это объясняет разницу.

...