Как конвертировать число секунд в формат «минуты:секунды» в SQL и 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработки часто возникает ситуация, когда время хранится в базе данных в виде обычного целого числа (количества секунд). Это удобно для математических расчетов, но совершенно нечитаемо для конечного пользователя. Согласитесь, пользователю гораздо привычнее видеть 2:10, чем 130. В данной статье мы разберем, как преобразовать эти данные в понятный формат «минуты:секунды» (MM:SS) двумя способами: непосредственно в запросе MS SQL Server и средствами платформы 1С.

Решение задачи средствами MS SQL Server

Если мы работаем напрямую с СУБД, нам необходимо использовать возможности языка T-SQL. Рассмотрим ситуацию, когда у нас есть поле Seconds с целочисленным значением. Основная логика заключается в выделении целой части минут и остатка секунд.

Способ 1: Математический расчет и конкатенация строк

Проанализируем самый простой с точки зрения логики подход. Мы делим общее количество секунд на 60, чтобы получить минуты, и используем оператор взятия остатка от деления (%), чтобы получить секунды. Однако здесь есть важный нюанс: если секунд меньше 10, формат может превратиться в «2:5» вместо «2:05». Чтобы этого избежать, мы добавим ведущий ноль.

Рассмотрим пример кода:


SELECT 
    CAST(Seconds / 60 AS VARCHAR) + ':' + 
    RIGHT('0' + CAST(Seconds % 60 AS VARCHAR), 2) AS [Время_ММ_СС]
FROM ВашаТаблица

Разберем, что здесь происходит:

  1. Seconds / 60 — выполняется целочисленное деление. Если тип данных поля INT, дробная часть будет отброшена автоматически.
  2. Seconds % 60 — мы получаем остаток, то есть «хвост» секунд, не вошедших в полные минуты.
  3. RIGHT('0' + ..., 2) — это важная функция форматирования. Мы приклеиваем символ «0» в начало секунд и берем только 2 правых знака. Если секунд было 5, получится «05», если 15 — получится «015», из которого функция RIGHT возьмет «15».

Способ 2: Использование функций времени (DATEADD и CONVERT)

Если нам нужно более элегантное решение и количество секунд не превышает 24 часов (86400), мы можем применить «трюк» с добавлением секунд к базовой дате.

Посмотрим на пример:


SELECT 
    CONVERT(VARCHAR(5), DATEADD(second, Seconds, '00:00:00'), 108) AS [Время_ММ_СС]
FROM ВашаТаблица

В этом случае функция DATEADD добавляет наши секунды к «нулевому» времени. Функция CONVERT с параметром 108 возвращает строку в формате HH:MM:SS. Если мы используем VARCHAR(5), SQL Server просто обрежет строку, оставив только часы и минуты, что не совсем то, что нам нужно для «минут и секунд». Чтобы получить именно минуты и секунды, лучше использовать 114 стиль или функцию SUBSTRING.

Способ 3: Функция FORMAT (SQL Server 2012+)

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


SELECT 
    FORMAT(DATEADD(second, Seconds, 0), 'mm:ss') AS [Время_ММ_СС]
FROM ВашаТаблица

Этот метод очень удобен, но помните, что на огромных выборках (миллионы строк) функция FORMAT работает медленнее, чем классический CAST и CONVERT.

Решение задачи в среде 1С:Предприятие

Теперь выясним, как решить ту же задачу, если вы работаете в экосистеме 1С. Здесь подход разделяется на работу в запросе и работу в коде (на встроенном языке).

Вариант 1: Преобразование в языке запросов 1С

Как справедливо заметили участники форума, в языке запросов 1С нельзя напрямую преобразовать число в строку. Однако мы можем преобразовать число в Дату. Это позволит нам использовать механизмы форматирования самой платформы при выводе данных.

Рассмотрим пример запроса:


ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, Т.КоличествоСекунд) КАК ПолеДата
ИЗ
    Справочник.ВашаТаблица КАК Т

После того как мы получили поле типа Дата, нам не нужно мучиться со строками в самом запросе. Если вы используете Систему компоновки данных (СКД), просто зайдите в настройки оформления поля и установите Форматную строку: ДФ=мм:сс. Платформа сама отобразит дату как нужное нам время.

Вариант 2: Преобразование во встроенном языке 1С

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


// Предположим, КоличествоСекунд = 130;
ПустаяДата = '00010101'; // Базовая дата 1С
НужнаяДата = ПустаяДата + КоличествоСекунд;
ПредставлениеВремени = Формат(НужнаяДата, "ДФ=мм:сс");
// Результат будет "02:10"

Здесь мы используем особенность 1С: при сложении объекта типа Дата и числа, система интерпретирует число как количество секунд и прибавляет их к дате. Функция Формат с параметром ДФ=мм:сс позволяет мгновенно получить красивую строку.

Важные нюансы и ограничения

Разберем несколько критических моментов, которые могут встретиться в работе:

  1. Значения более 60 минут: Если количество секунд равно 3661 (1 час, 1 минута и 1 секунда), стандартное форматирование мм:сс может показать 01:01, потеряв час. Если ваша задача — показать общее количество минут (например, 61:01), то методы с типом Дата не подойдут. В этом случае используйте только математический расчет: ЦелоеЧислоМинут = Цел(Секунды / 60).
  2. Типы данных в SQL: При делении в SQL Server убедитесь, что делите целое число на целое. Если поле имеет тип FLOAT, результат 130 / 60 будет 2.1666, и вам придется дополнительно использовать функцию FLOOR() для отсечения дробной части перед конвертацией в строку.
  3. Производительность: Старайтесь выполнять форматирование на стороне клиента (в 1С), если это возможно. СУБД должна эффективно отдавать данные, а визуальное представление — задача интерфейсного слоя.

Мы проанализировали различные подходы к конвертации времени. Выбор конкретного метода зависит от того, где именно вы хотите видеть результат: в консоли запросов SQL, в отчете СКД или в экранной форме 1С. Каждый из предложенных вариантов является рабочим и широко используется в профессиональной разработке.

← На главную