Если столбец 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