Сравнение даты и времени в SQL Server: учет только даты
Быстрый ответ
Для сравнения дат в SQL Server есть возможность привести тип datetime
к date
с использованием CAST
:
SELECT * FROM YourTable WHERE CAST(DateTimeColumn AS date) = 'ГГГГ-ММ-ДД';
Это действие позволит исключить время и произвести сравнение только по датам.
SARGable против Non-SARGable: Выбор в сторону эффективности
Методы SARGable повышают производительность запросов и эффективность работы индексов. Использование функций преобразования, таких как CONVERT()
, для столбцов с датой и временем делает запросы non-SARGable. Более предпочтительно применять сравнение по диапазону, применяя операторы >=
и <
:
SELECT * FROM YourTable
WHERE DateTimeColumn >= 'ГГГГММДД' AND DateTimeColumn < 'ГГГГММДД';
Полные 24 часа: покрываем весь день при помощи сравнения диапазонов
SQL Server рассматривает datetime
как комбинацию даты и времени до миллисекунды включительно. Для обозначения целого дня рекомендуется применять сравнение по диапазону:
SELECT * FROM YourTable
WHERE DateTimeColumn >= 'ГГГГ-ММ-ДД 00:00:00' AND DateTimeColumn < 'ГГГГ-ММ-ДД 23:59:59.997';
Привычка до SQL Server 2008
До появления типа DATE
в SQL Server преобразование datetime
в строку varchar
и назад было распространённой практикой:
SELECT * FROM YourTable
WHERE CONVERT(datetime, CONVERT(varchar, DateTimeColumn, 101)) = 'ММ/ДД/ГГГГ';
Визуализация
Схоже с упрощением сложного объекта до его контура:
Сложный объект (🗿) | Контур (👤) |
---|---|
Детализированная статуя | Очертания |
можно упростить datetime
до основной составляющей — date
:
SQL Datetime (📅⏰) | SQL Date (📅) |
---|---|
2023-04-01 15:45:00 | 2023-04-01 |
SELECT * FROM Events WHERE CAST(DateTimeColumn AS DATE) = '2023-04-01'
Ловушка с использованием BETWEEN
Использование BETWEEN
для сравнения даты и времени может привести к нежелательным результатам, т.к. конечное время попадает в диапазон. Рекомендуется задавать диапазоны вручную:
-- Некорректно: может затрагивать время следующего дня
SELECT * FROM YourTable
WHERE DateTimeColumn BETWEEN 'ГГГГ-ММ-ДД' AND 'ГГГГ-ММ-ДД';
-- Рекомендуется: чёткое указание границ
SELECT * FROM YourTable
WHERE DateTimeColumn >= 'ГГГГ-ММ-ДД' AND DateTimeColumn < 'ГГГГ-ММ-ДД 23:59:59.997';
Здесь и сейчас: cравнение с текущей датой
Для сравнения даты в столбце с текущей датой следует использовать функцию GETDATE()
, приведённую к типу DATE
:
SELECT * FROM YourTable
WHERE CAST(DateTimeColumn AS DATE) = CAST(GETDATE() AS DATE);
Полезные материалы
- CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — Руководство по использованию функций CAST и CONVERT в SQL Server.
- sql server – лучший способ конвертирования и проверки строки с датой – Stack Overflow — Обсуждение сравнения и валидации дат в T-SQL.
- Power BI Row Level Security — Рекомендации по наиболее эффективному использованию даты и времени в SQL Server.