Преобразование timestamp в дату в SQL

Как timestamp перевести в дату sql

Как timestamp перевести в дату sql

Конкретные функции конвертации отличаются между MySQL, PostgreSQL, SQLite и Oracle. Например, MySQL использует FROM_UNIXTIME, PostgreSQL – TO_TIMESTAMP, а SQLite работает с преобразованием через datetime() с указанием коэффициента. Важно учитывать разницу между секундами и миллисекундами, иначе результат будет смещён на десятилетия.

При работе с временными зонами SQL-движки применяют собственные механизмы. PostgreSQL хранит данные в UTC и изменяет отображение согласно параметрам сеанса, а MySQL опирается на системные таблицы зон. Перед конвертацией timestamp стоит проверить, в каком формате поступают данные: как число, строка или уже тип TIMESTAMP. Это влияет на выбор функции и необходимость дополнительных вычислений.

Преобразование UNIX-timestamp в календарную дату в MySQL

MySQL преобразует UNIX-timestamp через функцию FROM_UNIXTIME(). Она принимает число секунд от начала эпохи Unix и возвращает значение типа DATETIME. Формат можно задать вторым аргументом, что позволяет сразу получить строку в нужном виде.

Если данные хранятся в миллисекундах, требуется деление на 1000. Без этого MySQL интерпретирует значение как число секунд, и итоговая дата окажется некорректной. В таблицах журналов нередко встречаются большие значения, поэтому при выборке удобно приводить их к секундам прямо в запросе.

Ниже приведены основные варианты использования функции:

Задача Пример запроса
Преобразование секунд SELECT FROM_UNIXTIME(event_time);
Форматирование результата SELECT FROM_UNIXTIME(event_time, ‘%Y-%m-%d %H:%i:%s’);
Конвертация миллисекунд SELECT FROM_UNIXTIME(event_time / 1000);
Запись преобразованной даты в столбец UPDATE logs SET dt = FROM_UNIXTIME(ts);

Если требуется сравнение дат, MySQL позволяет использовать UNIX_TIMESTAMP() для обратного преобразования. Это удобно при фильтрации событий по промежутку, когда диапазон задан обычным DATETIME, а данные в таблице представлены в виде числового timestamp.

Использование функции TO_TIMESTAMP в PostgreSQL для чтения числа секунд

Функция TO_TIMESTAMP() принимает целое или дробное число секунд с начала эпохи Unix и преобразует его в значение типа TIMESTAMP WITH TIME ZONE или TIMESTAMP WITHOUT TIME ZONE в зависимости от контекста. PostgreSQL интерпретирует такие данные в UTC, корректируя отображение согласно параметрам сеанса.

При работе с данными, поступающими из журналов и систем мониторинга, встречаются разные форматы: секунды, миллисекунды и значения с плавающей точкой. Для корректной конвертации необходимо приводить входные числа к секундам.

  • Секунды передаются напрямую: SELECT TO_TIMESTAMP(ts);
  • Миллисекунды требуют деления на 1000: SELECT TO_TIMESTAMP(ts / 1000.0);
  • Данные с дробной частью дают точность до микросекунд: SELECT TO_TIMESTAMP(1698765432.123);
  1. Получение даты в стандартизированном виде: SELECT TO_CHAR(TO_TIMESTAMP(ts), ‘YYYY-MM-DD HH24:MI:SS’);
  2. Сравнение временных отметок: SELECT * FROM logs WHERE TO_TIMESTAMP(ts) > NOW() — INTERVAL ‘1 day’;
  3. Конвертация в запросах обновления: UPDATE metrics SET dt = TO_TIMESTAMP(raw_ts);

Если требуется сравнить значения timestamp без создания лишних преобразований, удобно использовать тип TIMESTAMPTZ для хранения UTC-значений, а TO_TIMESTAMP применять только при чтении исходного числа секунд.

Конвертация миллисекундного timestamp в читаемую дату в SQLite

SQLite интерпретирует timestamp в секундах, поэтому миллисекундные значения требуется делить на 1000. Преобразование выполняется через функции datetime() или strftime(), где первым аргументом передаётся число секунд от начала эпохи Unix.

При обработке журналов и метрик, где каждая запись содержит миллисекунды, можно выполнять конвертацию непосредственно в запросе выборки. Это избавляет от предварительной подготовки данных на стороне приложения.

Чтобы получить дату в произвольном виде, применяется выражение strftime(‘%Y-%m-%d %H:%M:%f’, ts / 1000, ‘unixepoch’), которое позволяет вывести доли секунды. Если дробная часть не нужна, достаточно формата ‘%Y-%m-%d %H:%M:%S’.

Преобразование столбца с числом секунд в тип DATETIME в Oracle

Преобразование столбца с числом секунд в тип DATETIME в Oracle

Oracle не содержит встроенной функции для прямого преобразования Unix-секунд, поэтому используется формула на основе даты 1970-01-01. Число секунд переводится в интервал дней и прибавляется к базовой отметке через DATE ‘1970-01-01’.

Если столбец хранит целые секунды, преобразование выполняется так: DATE ‘1970-01-01’ + (ts_column / 86400). При наличии дробной части Oracle корректно интерпретирует её как доли секунды, что позволяет обрабатывать данные с точностью до миллисекунд.

При обновлении таблиц можно записать преобразованную дату в отдельный столбец: UPDATE logs SET event_dt = DATE ‘1970-01-01’ + (ts_raw / 86400). Это удобно, если требуется хранить как исходное число секунд, так и дату для последующих выборок.

Перевод timestamp с временной зоной в локальное время в PostgreSQL

Если требуется разовый перевод без изменения параметров соединения, применяется конструкция AT TIME ZONE. Она преобразует данные в другой часовой пояс, возвращая TIMESTAMP без зоны. Например: SELECT ts AT TIME ZONE ‘Europe/Berlin’. Это удобно при подготовке отчётных данных для разных регионов.

При обработке внешних систем нередко приходят значения, содержащие явный суффикс зоны, например 2023-10-12T18:20:00+03. PostgreSQL корректно интерпретирует такие строки при вставке в TIMESTAMPTZ. Для перевода в локальное время достаточно задать целевую зону и выполнить преобразование: SELECT (timestamp_with_tz AT TIME ZONE ‘UTC’) AT TIME ZONE ‘Asia/Tokyo’.

Если значение хранится как текст, предварительно используется CAST или TO_TIMESTAMP() с указанием шаблона. Это позволяет избежать проблем с несоответствием форматов и исключает ошибки при дальнейших вычислениях.

Извлечение даты и времени из timestamp при выборке в MySQL

Извлечение даты и времени из timestamp при выборке в MySQL

В MySQL столбцы с типом TIMESTAMP или DATETIME позволяют хранить точное время событий. Для анализа часто требуется разделить дату и время или получить отдельные компоненты для фильтрации и группировки.

  • Получение только даты: SELECT DATE(event_time) FROM logs;
  • Получение только времени: SELECT TIME(event_time) FROM logs;
  • Извлечение года, месяца, дня: SELECT YEAR(event_time), MONTH(event_time), DAY(event_time) FROM logs;
  • Извлечение часов, минут, секунд: SELECT HOUR(event_time), MINUTE(event_time), SECOND(event_time) FROM logs;
  1. Полная дата с временем: SELECT DATE_FORMAT(event_time, ‘%Y-%m-%d %H:%i:%s’) FROM logs;
  2. Только день и месяц: SELECT DATE_FORMAT(event_time, ‘%d-%m’) FROM logs;
  3. Отображение в формате «день.месяц.год»: SELECT DATE_FORMAT(event_time, ‘%d.%m.%Y’) FROM logs;

При фильтрации по диапазону дат удобно использовать комбинацию DATE() и WHERE. Например: SELECT * FROM logs WHERE DATE(event_time) BETWEEN ‘2025-01-01’ AND ‘2025-01-31’; Это позволяет быстро получить записи за конкретный период без преобразования всего столбца в строку.

Форматирование результата конвертации через функции DATE_FORMAT и TO_CHAR

После преобразования timestamp в тип DATETIME или TIMESTAMP часто требуется представить дату в удобочитаемом формате. В MySQL используется функция DATE_FORMAT(), а в PostgreSQL и Oracle – TO_CHAR(). Они позволяют формировать строки с произвольным порядком компонентов и разделителей.

Примеры использования в MySQL:

  • Полная дата и время: SELECT DATE_FORMAT(event_time, ‘%Y-%m-%d %H:%i:%s’) FROM logs;
  • Только дата: SELECT DATE_FORMAT(event_time, ‘%d.%m.%Y’) FROM logs;
  • Месяц и день: SELECT DATE_FORMAT(event_time, ‘%m-%d’) FROM logs;

Примеры использования в PostgreSQL:

  • Полная дата и время: SELECT TO_CHAR(ts_column, ‘YYYY-MM-DD HH24:MI:SS’) FROM events;
  • Только год и месяц: SELECT TO_CHAR(ts_column, ‘YYYY-MM’) FROM events;
  • День недели и дата: SELECT TO_CHAR(ts_column, ‘Day, DD Month YYYY’) FROM events;

В Oracle синтаксис идентичен PostgreSQL. Форматирование через TO_CHAR() полезно при подготовке отчетов и экспорта, когда важно, чтобы дата отображалась в заданном стиле без изменения типа данных в таблице.

Вопрос-ответ:

Как преобразовать UNIX-timestamp в читаемую дату в MySQL?

В MySQL для преобразования UNIX-timestamp используется функция FROM_UNIXTIME(). Если timestamp хранится в секундах, достаточно передать его как аргумент: SELECT FROM_UNIXTIME(ts);. Если значение в миллисекундах, сначала делят его на 1000: SELECT FROM_UNIXTIME(ts / 1000);. Дополнительно можно задать формат вывода, используя второй параметр функции, например: FROM_UNIXTIME(ts, ‘%Y-%m-%d %H:%i:%s’).

Как работать с функцией TO_TIMESTAMP в PostgreSQL для чисел секунд?

Функция TO_TIMESTAMP() принимает число секунд с начала эпохи Unix и преобразует его в тип TIMESTAMP. Для целых секунд это просто: SELECT TO_TIMESTAMP(ts);. Если число миллисекунд, его необходимо разделить на 1000: SELECT TO_TIMESTAMP(ts / 1000.0);. Для отображения результата в конкретном формате применяется TO_CHAR(), например: SELECT TO_CHAR(TO_TIMESTAMP(ts), ‘YYYY-MM-DD HH24:MI:SS’);.

Как конвертировать миллисекундный timestamp в дату в SQLite?

SQLite работает с timestamp в секундах. Для миллисекундного значения необходимо деление на 1000. Пример запроса: SELECT datetime(ts / 1000, ‘unixepoch’) FROM logs;. Для вывода в другом формате используют функцию strftime(), например: SELECT strftime(‘%Y-%m-%d %H:%M:%S’, ts / 1000, ‘unixepoch’);. Это позволяет сразу получать данные в читаемом виде без дополнительной обработки на стороне приложения.

Как преобразовать столбец с числом секунд в тип DATETIME в Oracle?

В Oracle прямого аналога FROM_UNIXTIME нет, поэтому используют базовую дату DATE ‘1970-01-01’ и прибавляют число дней, вычисленное как секунды делённые на 86400. Пример: DATE ‘1970-01-01’ + (ts_column / 86400). Для форматирования даты применяется TO_CHAR(): TO_CHAR(DATE ‘1970-01-01’ + (ts_column / 86400), ‘YYYY-MM-DD HH24:MI:SS’). Это позволяет записывать преобразованные значения в отдельный столбец и использовать их для выборок и отчётов.

Как перевести timestamp с временной зоной в локальное время в PostgreSQL?

Значения типа TIMESTAMPTZ в PostgreSQL хранятся в UTC. Для перевода в локальное время можно установить временную зону на уровне сеанса: SET TIME ZONE ‘Europe/Moscow’; После этого все TIMESTAMPTZ будут отображаться с учётом указанного смещения. Для разового перевода используют AT TIME ZONE: SELECT ts_column AT TIME ZONE ‘Europe/Berlin’;. Это преобразует timestamp в указанный часовой пояс без изменения исходного значения.

Ссылка на основную публикацию