Мне нужно иметь возможность выполнить запрос, в котором я должен фильтровать по датам, в котором у меня есть дата начала и дата окончания, и чтобы запрос возвращал результаты, которые находятся в диапазоне этих двух дат.
Мне нужно иметь возможность выполнить запрос, в котором я должен фильтровать по датам, в котором у меня есть дата начала и дата окончания, и чтобы запрос возвращал результаты, которые находятся в диапазоне этих двух дат.
Воспользуйтесь оператором
between
. Если вам нужно передавать даты в SQL как литералы, используйте форматYYYYMMDD
, который, по моему опыту, всегда работает, независимо от языка/культуры, на которые настроены сервер и клиент SQL Server, короче говоря, чтобы увидеть данные за первый семестр. 2016 года запрос будет примерно таким:Если поля имеют тип DateTime, вы можете захотеть включить информацию о времени, в этом случае, продолжая пример использования литералов, вы можете использовать формат
YYYYMMDD HH24:MM:SS
, например:Рекомендуется по возможности передавать значения даты в качестве параметров, но окончательный синтаксис будет зависеть от возможностей уровня подключения к данным вашего языка программирования.
Лично я всегда использую следующий шаблон для этого типа запросов, который хорошо работает, если даты в вашей базе данных содержат компонент времени:
Больше пояснений...
Если в столбце
campofecha
есть компонент времени, очевидно, фильтр с:... неверно, потому что это эквивалентно:
... и это исключит такие даты, как
2014-05-06 12:00:00
.Это правда, что вы можете выразить условие, как это предлагается в принятом ответе:
...но с одной стороны мне это не кажется очень чистым. С другой стороны, в зависимости от того, где вы определяете параметры, может быть немного странно, что вам нужно определить компонент времени, и это может быть невозможно сделать в зависимости от используемого вами типа.
Но что более важно, теоретически это условие также ошибочно. Например, в SQL Server тип
datetime
также может включать доли секунд. Таким образом, возможно, хотя и маловероятно, что у вас есть дата2014-05-06 23:59:59.500
, которая исключена из запроса.Именно по этой причине я предпочитаю использовать включающее условие для даты начала и исключающее условие для конечной даты:
Это намного точнее и не может потерпеть неудачу. Единственным недостатком является то, что он не использует оператора
between
, который многим нравится.Но в связи с этим оставляю ссылку на статью, написанную Аароном Бертраном, признанным гуру SQL Server, который утверждает, что использование
between
опасно для таких типов состояний: Что общего между МЕЖДУ и дьяволом? .Я бы сделал это следующим образом:
Идеально, так как при обычном использовании вы вводили бы даты не напрямую в таблицу, а через приложение, где форматировали бы их как дату, с подходящей вам маской (ГГММДД, ДД-ММ-ГГГГ и т.д. . )
Использование WHERE в этом случае (как указано в другом ответе) непродуктивно, потому что для этого уже есть BETWEEN.