Округление времени до ближайшего интервала в T-SQL

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

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

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

Для округления времени до ближайшего 15-минутного интервала в T-SQL, используйте функции DATEADD и DATEDIFF.

SQL
Скопировать код
SELECT DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, @YourTime) / 15.0, 0) * 15, 0) AS RoundedTime

Подставьте вместо @YourTime вашу временную переменную. Сначала производится вычисление разницы в минутах относительно нулевого времени, затем округление до ближайшего 15-минутного интервала и добавление найденных минут обратно к нулевому времени.

Кинга Идем в IT: пошаговый план для смены профессии

Учёт общепринятых пауз и избежание логических ошибок

Предотвращение переполнения с будущими датами

Для предотвращения переполнения, к которому может привести использование нулевого времени на больших временных интервалах, воспользуемся более близким ко времени события эталоном:

SQL
Скопировать код
SELECT DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, '20000101', @YourTime) / 15.0, 0) * 15, '20000101') AS RoundedTime

В качестве такого эталона используйте дату начала нового тысячелетия, такой подход будет актуальным в контексте проблемы 2000 года (Y2K).

Округление до полуминуты

Если вам необходимо округление с точностью до секунд, сделайте округление до ближайшего полуминутного интервала – 30 секунд:

SQL
Скопировать код
SELECT DATEADD(SECOND, ROUND(DATEDIFF(SECOND, '20000101', @YourTime) / 30.0, 0) * 30, '20000101') AS RoundedTime

Этим способом можно учесть секунды для получения более точного округлённого времени.

Применение округления к множеству столбцов

В случае необходимости округления времени начала и окончания (starttime и stoptime), используйте следующий подход:

SQL
Скопировать код
SELECT 
  DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, starttime) / 15.0, 0) * 15, 0) AS RoundedStartTime,
  DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, stoptime) / 15.0, 0) * 15, 0) AS RoundedStopTime
FROM YourTable

Это позволит согласовать округление времени в разных столбцах.

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

Демонстрация процесса на примере часов, разделенных на четыре отрезка по 15 минут:

Markdown
Скопировать код
Взгляните на эти часы: 🕒

Округление вниз ⬇️ | Фактическое время | Округление вверх ⬆️
--------------|-------------|------------
🕐 (1:00)     | 1:07        | 🕜 (1:15)
🕑 (2:00)     | 2:14        | 🕝 (2:15)
🕒 (3:00)     | 3:23        | 🕞 (3:30)

Примеры округления на практике:

Markdown
Скопировать код
🔴 1:07 ближе к 🕐 (1:00), округляем ВНИЗ.
🟢 2:14 находится на границе, округление может быть ВВЕРХ или ВНИЗ, в зависимости от предпочтений.
🔵 3:23 ближе к 🕞 (3:30), округляем ВВЕРХ.

Это наглядно демонстрирует процесс округления времени до ближайшего четвертьчаса.

Погружение в тему: варианты округления и практические методики

Округление вниз или вверх с использованием функций FLOOR и CEILING

Используйте функции FLOOR и CEILING для округления времени вниз или вверх соответственно:

SQL
Скопировать код
SELECT DATEADD(MINUTE, FLOOR(DATEDIFF(MINUTE, 0, @YourTime) / 15.0) * 15, 0) AS RoundedDownTime
SELECT DATEADD(MINUTE, CEILING(DATEDIFF(MINUTE, 0, @YourTime) / 15.0) * 15, 0) AS RoundedUpTime

Учет мельчайших деталей

Для достижения максимальной точности вы можете привести время к типу float перед округлением:

SQL
Скопировать код
SELECT DATEADD(MINUTE, CAST((DATEDIFF(MINUTE, 0, CAST(@YourTime AS float)) / 15.0) AS INT) * 15, 0) AS RoundedTime

Исключение секунд для упрощения

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

SQL
Скопировать код
SELECT CAST(CAST(@YourTime AS smalldatetime) AS time) AS RoundedTimeApprox

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

Нейтрализация временных "бомб": интеграция в существующие системы

Следует быть внимательными при обновлении T-SQL кода, чтобы внедрение новых методов не вызвало сбоев:

SQL
Скопировать код
UPDATE YourTable
SET @YourTime = DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, @YourTime) / 15.0, 0) * 15, 0)
WHERE some_condition

Тщательное тестирование является ключом к успешной реализации изменений без ущерба для базы данных.

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

  1. SQL Server: функция ROUND — подробное пособие по округлению в SQL Server.
  2. C# Corner – пошаговое руководство по округлению DateTime по интервалу — шаг за шагом к округлению дат и времени в SQL Server.
  3. SQL Shack – статья об округлении временных меток в SQL — глубокий анализ методов округления временных меток в SQL.
  4. SQL Authority – округление времени до ближайшей минуты или часа в SQL — обзор методов округления времени до ближайшей минуты или часа в SQL.