Сравнение даты и времени в SQL Server: учет только даты

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

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

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

Для сравнения дат в SQL Server есть возможность привести тип datetime к date с использованием CAST:

SQL
Скопировать код
SELECT * FROM YourTable WHERE CAST(DateTimeColumn AS date) = 'ГГГГ-ММ-ДД';

Это действие позволит исключить время и произвести сравнение только по датам.

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

SARGable против Non-SARGable: Выбор в сторону эффективности

Методы SARGable повышают производительность запросов и эффективность работы индексов. Использование функций преобразования, таких как CONVERT(), для столбцов с датой и временем делает запросы non-SARGable. Более предпочтительно применять сравнение по диапазону, применяя операторы >= и <:

SQL
Скопировать код
SELECT * FROM YourTable 
WHERE DateTimeColumn >= 'ГГГГММДД' AND DateTimeColumn < 'ГГГГММДД';

Полные 24 часа: покрываем весь день при помощи сравнения диапазонов

SQL Server рассматривает datetime как комбинацию даты и времени до миллисекунды включительно. Для обозначения целого дня рекомендуется применять сравнение по диапазону:

SQL
Скопировать код
SELECT * FROM YourTable 
WHERE DateTimeColumn >= 'ГГГГ-ММ-ДД 00:00:00' AND DateTimeColumn < 'ГГГГ-ММ-ДД 23:59:59.997';

Привычка до SQL Server 2008

До появления типа DATE в SQL Server преобразование datetime в строку varchar и назад было распространённой практикой:

SQL
Скопировать код
SELECT * FROM YourTable 
WHERE CONVERT(datetime, CONVERT(varchar, DateTimeColumn, 101)) = 'ММ/ДД/ГГГГ';

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

Схоже с упрощением сложного объекта до его контура:

Сложный объект (🗿)Контур (👤)
Детализированная статуяОчертания

можно упростить datetime до основной составляющей — date:

SQL Datetime (📅⏰)SQL Date (📅)
2023-04-01 15:45:002023-04-01
SQL
Скопировать код
SELECT * FROM Events WHERE CAST(DateTimeColumn AS DATE) = '2023-04-01'

Ловушка с использованием BETWEEN

Использование BETWEEN для сравнения даты и времени может привести к нежелательным результатам, т.к. конечное время попадает в диапазон. Рекомендуется задавать диапазоны вручную:

SQL
Скопировать код
-- Некорректно: может затрагивать время следующего дня
SELECT * FROM YourTable 
WHERE DateTimeColumn BETWEEN 'ГГГГ-ММ-ДД' AND 'ГГГГ-ММ-ДД';

-- Рекомендуется: чёткое указание границ
SELECT * FROM YourTable 
WHERE DateTimeColumn >= 'ГГГГ-ММ-ДД' AND DateTimeColumn < 'ГГГГ-ММ-ДД 23:59:59.997';

Здесь и сейчас: cравнение с текущей датой

Для сравнения даты в столбце с текущей датой следует использовать функцию GETDATE(), приведённую к типу DATE:

SQL
Скопировать код
SELECT * FROM YourTable 
WHERE CAST(DateTimeColumn AS DATE) = CAST(GETDATE() AS DATE);

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

  1. CAST и CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — Руководство по использованию функций CAST и CONVERT в SQL Server.
  2. sql server – лучший способ конвертирования и проверки строки с датой – Stack Overflow — Обсуждение сравнения и валидации дат в T-SQL.
  3. Power BI Row Level Security — Рекомендации по наиболее эффективному использованию даты и времени в SQL Server.