Обычно используйте стандартную функцию SQL EXTRACT()
. Ваш комментарий :
То, что я хочу сохранить в password_reset_expires
, а password_changed_at
- это число вроде этого 1594329364292
... указывает вы хотите сохранить количество миллисекунд с эпохи UNIX 1970-01-01 00: 00: 00 как целочисленное значение. Но это выходит за пределы диапазона типа integer
(подписанный int4
), который позволяет использовать числа до 2 ^ 31-1 = 2147483647 . На момент написания уже прошло 1594335691272 миллисекунды с эпохи.
Либо сохранить секунды в столбце integer
:
ALTER TABLE users ALTER COLUMN password_reset_expires TYPE integer
USING (EXTRACT(EPOCH FROM password_reset_expires)::int);
Или сохранить миллисекунды в столбце bigint
(подписанный int8
, позволяет до 2 ^ 63-1 = 9223372036854775807 ):
ALTER TABLE users ALTER COLUMN password_reset_expires TYPE bigint -- !
USING (EXTRACT(EPOCH FROM password_reset_expires)::bigint * 1000);
EXTRACT(EPOCH FROM ...)
возвращает, согласно руководству :
Для значений timestamp with time zone
количество секунд с 1970-01-01 00:00:00 UT C (может быть отрицательным); для значений date
и timestamp
количество секунд с 1970-01-01 00:00:00 по местному времени; для значений interval
общее количество секунд в интервале
Поскольку в этом случае источником является date
, дробных секунд быть не может, и мы можем просто умножить на 1000, чтобы получить число миллисекунд.
Опять же, если не может быть миллисекунд, зачем сохранять количество миллисекунд для начала?
Что еще более важно, почему бы не сохранить date
? Если значение на самом деле представляет дату, тип данных date
почти наверняка является лучшим вариантом.