Округление времени в SQL: получение данных по датам
Быстрый ответ
Для того чтобы найти ближайшую полночь в SQL, используйте следующий запрос:
SELECT CAST(CAST(your_datetime_column AS DATE) AS DATETIME);
Такое преобразование поля типа DateTime в DATE обнуляет время, а следующее преобразование обратно в DATETIME позволяет получить точное значение полуночи.
Работа с устаревшими версиями: SQL Server 2005
Если вы используете SQL Server 2005 или более раннюю версию, то можете прибегнуть к использованию функций DATEADD и DATEDIFF:
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, your_datetime_column), 0) AS RoundedDateTime;
Функция DATEDIFF
применяется относительно базовой даты ('1900-01-01' соответствует '0'), а функция DATEADD
возвращает полученное значение. Таким образом, «лишние» секунды просто исчезнут!
Фильтрация по дате: точность настройки
Фильтрация записей по дате с использованием округления в условиях WHERE позволяет достигнуть точности, сравнимой с механизмом швейцарских часов:
-- Для 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 это означает обнуление всех часов, минут и секунд:
CAST(CURRENT_TIMESTAMP AS DATE)
-- Теперь это только дата, а время обнулено до полуночи!
Часы пробивают двенадцать, и 🌙✨ вот, ваш метка времени 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 с целью округлить до ближайшего дня. Это может сыграть с вами злую шутку:
-- Некорректный подход
SELECT GETDATE() + 0.5; -- Осторожно! Это добавит около 12 часов, но не полный день!
-- Правильный метод
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME);
Не пытайтесь обойти систему, используя числа с плавающей запятой. При работе с датами лучше полагаться на проверенные функции.
Совместимость с разными версиями сервера
Важно обеспечить корректную работу вашего скрипта на всех версиях SQL Server. При выборе методов учитывайте уровни совместимости серверов, чтобы предотвратить ошибки при выполнении.
Полезные материалы
- CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — здесь Microsoft рассказывает о преобразовании типов данных.
- DATEPART (Transact-SQL) – SQL Server | Microsoft Learn — этот материал посвящен функции DATEPART, которая помогает извлекать конкретные части даты.
- DATEDIFF (Transact-SQL) – SQL Server | Microsoft Learn — подробная информация о функции DATEDIFF от Microsoft.