Если столбец MyDate
равен datetime
, как кажется, значит, он уже находится в правильном «формате». Не конвертируйте его в varchar(50)
в условии предиката - это сделает ваш запрос несортируемым и снизит производительность для любых индексов, которые у вас могут быть.
Вместо этого примите ваши параметры как date
или datetime
экземпляров:
SELECT ...
FROM MyTable
WHERE MyDate >= @BeginDate
AND MyDate <= @EndDate
Ваш запрос не должен зависеть от определенного формата даты во входных параметрах - эти параметры не являются типами varchar
, они datetime
(или date
). Когда вы запускаете этот запрос или хранимую процедуру из любой среды, в которой находится приложение, и задаете параметры привязки (вы используете параметры связывания, верно?), Указанная библиотека автоматически решит любые проблемы с форматированием.
Если вы попытаетесь использовать операторы >=
и <=
для символьных представлений дат в любом формате, отличном от стандарта ISO yyyymmdd
, вы получите неправильные результаты, поскольку алфавитный порядок отличается от временный порядок. Не делай этого.
Если вам просто нужно написать специальный запрос, т. Е. Он не выполняется из какой-либо среды программирования, тогда просто не используйте формат dd/mm/yyyy
. Вместо этого используйте формат даты ISO; оно однозначно и неявно преобразуется в datetime
значения:
SELECT ...
FROM MyTable
WHERE MyDate >= '20091231'
AND MyDate <= '20100231'
Честно говоря, никакое другое решение не является приемлемым в моей голове. Для специальных запросов всегда используйте однозначный стандарт ISO для дат. Для приложений, подключающихся к базе данных, всегда используйте параметры связывания. Если вы делаете что-то еще, вы пишете код, который либо ненадежен, либо ненадежен, либо и то, и другое.