Проблема с типом signed int при хранении unix timestamp

Как известно, в 2038 году будет такой момент, когда в типе данных int уже не получится хранить число секунд эпохи — с момента 1 января 1970 года. Проверить это можно SQL запросами. Не забудьте сделать резервную копию данных. Шутка 🙂

Вот так можно грубо проверить, что на указанную дату приходится переполнение типа signed int:

SELECT date_part('epoch',('2038-01-20'))::INT

Вы получите ошибку «integer out of range».

С точностью до минуты я подобрал время переполнения типа (оговорка: при вычислении используется timestamptz, т.е. запросы корректны для моего часового пояса Europe/Moscow — для других надо подправлять количество часов при вычитании). Запрос

SELECT date_part('epoch',('2038-01-20')::timestamptz - INTERVAL '17 hour' - INTERVAL '46 minutes')::INT

еще выдает число секунд, а вот запрос

SELECT date_part('epoch',('2038-01-20')::timestamptz - INTERVAL '17 hour' - INTERVAL '45 minutes')::INT

уже опять-таки выдает ошибку «integer out of range».

You can leave a response, or trackback from your own site.

Leave a Reply