Обновление нескольких временных меток Postgres
Я пытаюсь обновить временные метки для 100 объектов в Postgres 12, используя следующий запрос:
UPDATE foo_bar AS c SET
created_at = c2.created_at
FROM (VALUES
(101, '2021-09-27 14:54:00.0+00'),
(153, '2021-06-02 14:54:00.0+00')
) as c2(id, created_at)
WHERE c.id = c2.id;
Где created_at
представляет поле dateTimeField:
created_at = models.DateTimeField(auto_now_add=True)
Я получаю следующую ошибку:
ERROR: column "created_at" is of type timestamp with time zone but expression is of type text
Я перепробовал множество вариантов значений created_at, но безрезультатно. Есть идеи, почему это не работает?
Спасибо @a_horse_with_no_name за ответ. Мне пришлось привести значения к временным меткам с временными зонами, как показано ниже:
UPDATE foo_bar AS c SET
created_at = c2.created_at
FROM (VALUES
(101, '2021-09-27 14:54:00.0+00::timestamptz'),
(153, '2021-06-02 14:54:00.0+00::timestamptz')
) as c2(id, created_at)
WHERE c.id = c2.id;
Документация по Postgres, объясняющая, как работает кастинг (ссылка):
Приведение определяет, как выполнить преобразование между двумя типами данных
По умолчанию, приведение может быть вызвано только явным запросом приведения, то есть явной конструкцией CAST(x AS typename) или x::typename.
Документация по Postgres объясняет timestamptz
(link):
timestamptz принимается как сокращение для временной метки с часовым поясом