2013-02-25 5 views
1

У меня есть выбор, где мне нужно убедиться, что мой adate varchar (8) находится между двумя датами.Получение ошибки при попытке сравнить две даты

иногда переданные значения имеют значение NULL, поэтому я бы показал все.

select something from myTable where 
convert(date, adate) >= ISNULL(convert(date,@beginDate), convert(date, adate)) 

работает отлично

, но когда я делаю это:

select something from myTable where 
convert(date, adate) >= ISNULL(convert(date,@beginDate), convert(date, adate)) 
and convert(date, adate) <= ISNULL(convert(date,@endDate), convert(date, adate)) 

я получаю:

Конверсия удалось при преобразовании даты и/или времени из строки символов.

или я могу сделать < = строка без> = без ошибок, но не оба вместе, что происходит?

две линии выглядят одинаково, я не могу понять, что я делаю неправильно здесь .....

+1

Вы даете нам образец данных, которые вы используете? Какие СУБД вы используете? Как первый взгляд, я бы сказал, что endDate не имеет того же формата, что и beginDate, но не уверен в этом. – araknoid

+0

Вы используете данные 'char'acter здесь? – Paul

+0

Почему вы их конвертируете? Не работает ли 'adate <= @ beginDate'? Даже если вы используете (о, ужас!) 'CHAR (8)' для дат, нормальный формат будет избегать всех этих преобразований. –

ответ

0

Я не уверен, о том, что вы пытаетесь сделать, но ... Поскольку любое из значений может быть получено NULIFIED, вы сказали, что получите каждый результат в таблице ... так что было бы проще просто настроить запрос на его фильтрацию на языке, который вы используете до DB ...

Или, как я бы поставил на PHP образец ...

IF (!$beginDate || !$endDate) 
    { 
     $query = "SELECT * FROM myTable"; 
    } 
    ELSE 
    { 
     $query = "SELECT * FROM myTable WHERE 'whatever clause'"; 
    } 
1

Проверьте значение @Дата окончания. Этот параметр является вашей единственной разницей между SELECT, который работает, и тем, который этого не делает. Скорее всего, он (иногда) содержит значение, которое нельзя преобразовать в дату. Обычным подозреваемым является пустая строка ('')

1

Он выглядит как @startdate, а @enddate - строковые. Лучше всего иметь их в формате ISO (yyyymmdd), и все должно быть в порядке.

Например, попробуйте использовать их;

Select @startdate = '20130101', @enddate = '20130221' 
Смежные вопросы