Если столбец 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 для дат. Для приложений, подключающихся к базе данных, всегда используйте параметры привязки. Если вы делаете что-то еще, вы пишете код либо ненадежный, либо небезопасный, либо и то, и другое.
14.03.2010