У меня есть столбец added_at
типа timestamp without time zone
. Я хочу, чтобы это значение по умолчанию являлось текущим датой, но без часового пояса. Функция now()
также возвращает часовой пояс.
Как решить эту проблему?
У меня есть столбец added_at
типа timestamp without time zone
. Я хочу, чтобы это значение по умолчанию являлось текущим датой, но без часового пояса. Функция now()
также возвращает часовой пояс.
Как решить эту проблему?
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(...)
, как показано выше.
Потратьте некоторое время на просмотр руководств - они полностью охватывают все это.
CURRENT_TIME и CURRENT_TIMESTAMP доставляют значения с часовым поясом; LOCALTIME и LOCALTIMESTAMP предоставляют значения без часовой пояс.