Используйте clock_timestamp()
для текущего момента
now()
- это традиционный PostgreSQL, эквивалентный transaction_timestamp()
, который, в свою очередь, эквивалентен CURRENT_TIMESTAMP
. Эти три команды возвращают момент начала транзакции. См. руководство .
Чтобы получить время начала текущего оператора, а точнее время получения последнего командного сообщения от клиента, наберите statement_timestamp()
.
Чтобы зафиксировать момент, когда функция выполняется, вызовите clock_timestamp()
.
Установка часового пояса по умолчанию
Вы можете установить часовой пояс по умолчанию одним из двух способов, как описано в здесь :
- SQL -стандарт:
SET TIME ZONE 'Africa/Cairo' ;
- Postgres -specifi c: УСТАНОВИТЬ часовой пояс TO 'Africa / Cairo';
Пример
Вот скриншот, показывающий три вещи:
- Текущий момент, как видно в UT C на веб-сайте Time.is.
- Запрос, показывающий текущий часовой пояс по умолчанию и текущий момент.
- Запрос (мгновение спустя, когда я переключил windows), показывающий изменение текущего часового пояса по умолчанию, а также запрос для текущей зоны и текущего момента.
Для этой демонстрации я использовал службу управляемой базы данных от DigitalOcea n.com для Postgres 12.
We can see in this shot that the current moment in UTC is 2:30 AM. The west coast time in US is 7:30 PM the prior day, seven hours behind UTC. The current default time zone in the first session is UTC (GMT), showing a correct time of 2:30 AM, in agreement with Time.is web site. The second session we switch to Africa/Cairo
time zone, to find the current moment seen through that time zone is 4:30 AM, two hours ahead of UTC.
All this makes sense, and seems correct to me.
Based on other's comments, I suspect the system clock of your host computer is incorrect. I wonder if the time zone on the server is set to one time zone, but the actually time-of-day is set to the current time of a different time zone. This would only happen if manually set by a sysadmin, I expect, as the host OS should auto-correct if set to check a time server.
To verify this, I suggest you do something similar to what I did, to verify the database server’s clock:
- Open a browser window for Time.is, selecting UTC.
- Set current default time zone to UTC:
SET TIME ZONE 'GMT' ;
.
- Query database for current default time zone and the current moment. Use
clock_timestamp
rather than a transaction-start function like now
to avoid confusion with a long-running txn.
➥If Time.is does not agree with your result from clock_timestamp
, then we know your server time is set incorrectly.
Take a screenshot, post with your Question.
Tips:
- Learn to think, work, log, and debug in UT C. Забудьте о своем ограниченном часовом поясе на работе. Думайте о UT C как о Едином Истинном Времени, а все остальные зоны - всего лишь вариации.
- Как правило, лучше всего настроить ваши серверы на UT C (смещение нуля часов-минут-секунд).
- Я рекомендую настроить ваши серверы так, чтобы они проверяли с помощью сервера времени автокоррекцию их часов, если у вас есть доступ к надежным серверам времени.