Преобразование bigint в формат даты в PostgreSQL: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы преобразовать значение поля bigint в формат даты в PostgreSQL, используйте функции to_timestamp и to_char.

SQL
Скопировать код
SELECT to_timestamp(your_bigint) AS formatted_date FROM your_table;

Преобразование выполняется относительно времени Unix epoch. Чтобы получить дату в более понятном или заданном пользователем формате, используйте функцию to_char:

SQL
Скопировать код
SELECT to_char(to_timestamp(your_bigint), 'YYYY-MM-DD') AS formatted_date FROM your_table;
Кинга Идем в IT: пошаговый план для смены профессии

Конвертация миллисекунд в секунды

Если значение bigint представляет время в формате Unix epoch, выраженное в миллисекундах, приведите его к секундам, разделив на 1000:

SQL
Скопировать код
-- Волшебное число – 1000!
SELECT to_char(to_timestamp(your_bigint / 1000), 'DD/MM/YYYY HH24:MI:SS') AS formatted_date FROM your_table;

Это преобразование позволит сохранить точное время.

Приведение типов

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

SQL
Скопировать код
-- Искренняя экспрессия чувств:
SELECT to_timestamp(your_bigint::text, 'YYYY-MM-DD HH24:MI:SS') AS formatted_date
FROM your_table;

Исключая путаницу с timestamptz (меткой времени с часовым поясом), используйте ::timestamp для приведения к метке времени без учета часового пояса:

SQL
Скопировать код
-- Обошли сложности отношений с часовыми поясами
SELECT to_timestamp(your_bigint)::timestamp AS formatted_date FROM your_table;

Коррекция смещения относительно Unix epoch

Если ваше значение bigint содержит смещение относительно Unix epoch, прежде проведите коррекцию:

SQL
Скопировать код
-- Проверьте перед использованием
SELECT to_char(to_timestamp((your_bigint – offset) / 1000), 'YYYY-MM-DD HH24:MI:SS') AS formatted_date FROM your_table;

Такой шаг поможет сохранить точность дат с учетом временных смещений эпохи.

Предохранение от ошибок

Всегда проверьте результат после преобразования bigint в дату:

SQL
Скопировать код
-- Null – это плохо
SELECT formatted_date FROM your_table
WHERE to_timestamp(your_bigint) IS NOT NULL;

Всегда лучше предотвратить появление нулевых значений и ошибок форматирования.

Обновление типа столбца в таблице

Если необходимо обновить представление таблицы, измените тип столбца с помощью ALTER TABLE:

SQL
Скопировать код
-- Кардинальные изменения для таблиц
ALTER TABLE your_table ALTER COLUMN your_column TYPE timestamp USING to_timestamp(your_bigint);

Это позволит сохранить ваши данные при их преобразовании.

Визуализация

Таинственное значение bigint:

Markdown
Скопировать код
bigint: 1622476800000 // Напоминает символы из "Матрицы", неправда ли?

Превращается в легко читаемую дату благодаря возможностям PostgreSQL:

SQL
Скопировать код
SELECT to_char(to_timestamp(1622476800000 / 1000), 'DD/MM/YYYY') AS formatted_date;

Загадка bigint разгадана:

Markdown
Скопировать код
Дата: 📅 01/06/2021 // Как видеть истинную матрицу впервые!

PostgreSQL превращает бессонные ночи, проведенные в компании с bigint, в мирные сновидения о датах.

Полезные нюансы

Часовые пояса не только для джетлага

Вкратце: если вам важна точность с учетом часового пояса, воспользуйтесь AT TIME ZONE:

SQL
Скопировать код
-- Защищаем наши даты от изменений временных зон
SELECT to_char(to_timestamp(your_bigint) AT TIME ZONE 'UTC', 'YYYY-MM-DD HH24:MI:SS') AS formatted_date FROM your_table;

Управление транзакциями

При планировании значительных изменений контролируйте процесс с помощью BEGIN и COMMIT:

SQL
Скопировать код
-- Если не уверены – не торопитесь с COMMIT
BEGIN;
-- Ваши изменения под ALTER TABLE
COMMIT;

Проверка диапазона значений bigint

Исключите возможные проблемы с преобразованием значений, выходящих за пределы, проверяя диапазон:

SQL
Скопировать код
-- Правильное время и правильное число
SELECT to_char(to_timestamp(your_bigint), 'YYYY-MM-DD') AS formatted_date
FROM your_table
WHERE your_bigint BETWEEN '-2147483648' AND '2147483647';

Полезные материалы

  1. PostgreSQL: Документация: 4.2. Выражения значений — Сведения о приведении типов в PostgreSQL.
  2. PostgreSQL: Документация: 9.9. Функции и операторы для работы с датой и временем — Обзор возможностей PostgreSQL для преобразования bigint в дату.
  3. Типы данных PostgreSQL: Дата, Время и Часовые пояса — Подробная информация о работе с датой и временем в PostgreSQL.
  4. PostgreSQL: Документация: 9.8. Функции форматирования типов данных — Детальное руководство по функциям форматирования для работы с датами в PostgreSQL.