У меня есть столбец added_at типа timestamp without time zone. Я хочу, чтобы это значение по умолчанию являлось текущим датой, но без часового пояса. Функция now() также возвращает часовой пояс.
Как решить эту проблему?
Ответ 1
SELECT now()::timestamp
Это все. Литье преобразует метку времени в текущую временную метку вашего часового пояса. Это также как стандартная функция SQL LOCALTIMESTAMP реализована в Postgres.
Если вы не работаете в нескольких часовых поясах, это работает нормально. Else переключитесь на timestamptz для added_at. Разница?
SELECT now() AT TIME ZONE current_setting('TimeZone');
SELECT now() AT TIME ZONE 'Europe/Paris';
SELECT now() AT TIME ZONE 'UTC';
Не уверен, как это имеет смысл для столбца "added_at". Вы почти всегда хотите, чтобы абсолютная метка времени (временная метка с часовым поясом) не была плавающей.
Изменить ответ на следующие пункты:
Да, следует использовать временную метку с часовым поясом (абсолютное время), если у вас нет веской причины не делать этого.
Часовой пояс клиента задается SHOW TimeZone или current_setting(...), как показано выше.
Потратьте некоторое время на просмотр руководств - они полностью охватывают все это.