Округление времени в SQL: получение данных по датам

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

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

Для того чтобы найти ближайшую полночь в SQL, используйте следующий запрос:

SQL
Скопировать код
SELECT CAST(CAST(your_datetime_column AS DATE) AS DATETIME);

Такое преобразование поля типа DateTime в DATE обнуляет время, а следующее преобразование обратно в DATETIME позволяет получить точное значение полуночи.

Работа с устаревшими версиями: SQL Server 2005

Если вы используете SQL Server 2005 или более раннюю версию, то можете прибегнуть к использованию функций DATEADD и DATEDIFF:

SQL
Скопировать код
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, your_datetime_column), 0) AS RoundedDateTime;

Функция DATEDIFF применяется относительно базовой даты ('1900-01-01' соответствует '0'), а функция DATEADD возвращает полученное значение. Таким образом, «лишние» секунды просто исчезнут!

Фильтрация по дате: точность настройки

Фильтрация записей по дате с использованием округления в условиях WHERE позволяет достигнуть точности, сравнимой с механизмом швейцарских часов:

SQL
Скопировать код
-- Для SQL Server новего поколения (2008 и выше)
WHERE your_datetime_column >= CAST(GETDATE() – INTERVAL 'X DAY' AS date)

-- Для более старых версий (SQL Server 2005)
WHERE your_datetime_column >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE() – INTERVAL 'X DAY'), 0)

Вместо 'X' подставьте количество дней, которые вы хотите отсчитать от настоящего момента. '-6' позволит вам получить дату неделю назад, '-365' — год назад, '-7305' — примерно за всю историю (это, конечно, шутка!).

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

DateTime в SQL можно сравнить со спешащим ящером, у которого на весь день расписаны дела:

Полный день выглядит так: [🍳🕖, 📊🕙, 🍔🕛, 💻🕒, 🏃🕕, 🥘🕖]

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

Начало нового дня такое: [🌙🕛]

В контексте SQL это означает обнуление всех часов, минут и секунд:

SQL
Скопировать код
CAST(CURRENT_TIMESTAMP AS DATE)
-- Теперь это только дата, а время обнулено до полуночи!

Часы пробивают двенадцать, и 🌙✨ вот, ваш метка времени SQL для начала нового дня обновлена и готова к работе.

Особые случаи: завтра, вчера и ошибки округления

Полночь на день раньше или позже

Есть случаи, когда полезно получить значение полуночи предыдущего или следующего дня. SQL даёт возможность сделать и это:

SQL
Скопировать код
-- Полночь прошлого дня
SELECT DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()), 0) AS YesterdayMidnight;

-- Полночь следующего дня
SELECT DATEADD(DAY, DATEDIFF(DAY, -1, GETDATE()), 0) AS TomorrowMidnight;

SQL ориентируется на смещение в один день – это удобно и практично.

Подводные камни округления

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

SQL
Скопировать код
-- Некорректный подход
SELECT GETDATE() + 0.5; -- Осторожно! Это добавит около 12 часов, но не полный день!

-- Правильный метод
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME);

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

Совместимость с разными версиями сервера

Важно обеспечить корректную работу вашего скрипта на всех версиях SQL Server. При выборе методов учитывайте уровни совместимости серверов, чтобы предотвратить ошибки при выполнении.

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

  1. CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — здесь Microsoft рассказывает о преобразовании типов данных.
  2. DATEPART (Transact-SQL) – SQL Server | Microsoft Learn — этот материал посвящен функции DATEPART, которая помогает извлекать конкретные части даты.
  3. DATEDIFF (Transact-SQL) – SQL Server | Microsoft Learn — подробная информация о функции DATEDIFF от Microsoft.