Добрый день!
XP+SP2
BCB 6, FireBird 1/5, FIB
ПРоблема
В программе динамически формирую select вида
select count(*) from t1
where per in (1,3) and cast (DATA_C as date )>'27.02.2009'
DATA_C определена как varchar, в ней лежит в стринговом виде дата.
В таблице есть запись с per=6 и с "кривой датой" - "27.43.2008". При выполнении запроса выдается ошибка.
Хотя вроде бы , по моему разумению, такая запись не должна входить в список выбираемых записей по условию "per in (1,3)".
Как такое может быть? И как это вылечить?
Спасибо
ошибка проверки даты
Re: ошибка проверки даты
Полагаю, тут не будут приводить многочисленные способы обхода этой "лишней" проверки, пока не убедятся, что по-нормальному сделать нельзя.
Так что лучше сразу написать:
* Зачем поле даты хранится в строке? Почему нельзя его перевести в дату (да, изменив структуру базы)?
* Если и правда нельзя менять, почему бы не добавить отдельное поле с нормальной датой?
* Почему нельзя исправить кривую дату?
* Если вообще всё нельзя, то какие индексы у таблицы и каково примерное число записей: всего; попадающих под условие per in (..); попадающих под DATA_C > нужной_даты; попадающих под оба условия.
Так что лучше сразу написать:
* Зачем поле даты хранится в строке? Почему нельзя его перевести в дату (да, изменив структуру базы)?
* Если и правда нельзя менять, почему бы не добавить отдельное поле с нормальной датой?
* Почему нельзя исправить кривую дату?
* Если вообще всё нельзя, то какие индексы у таблицы и каково примерное число записей: всего; попадающих под условие per in (..); попадающих под DATA_C > нужной_даты; попадающих под оба условия.
Re: ошибка проверки даты
порядок проверки предикатов в 1.5 не гарантируется. так что может быть, что сначала проверяется cast, а потом уже in.
Re: ошибка проверки даты
2kdv
Спасибо за информацию. Как обойти ситуацию буду решать.
А если, написать так (добавить () )
select count(*) from t1
where (per in (1,3)) and cast (DATA_C as date )>'27.02.2009'
ничего не изменится? С т.зр. логики сначала должен выполниться предикат в скобках , а вот следующий будет выполняться над всеми данными или уже над набором-результатом выполнения первого?
Спасибо за информацию. Как обойти ситуацию буду решать.
А если, написать так (добавить () )
select count(*) from t1
where (per in (1,3)) and cast (DATA_C as date )>'27.02.2009'
ничего не изменится? С т.зр. логики сначала должен выполниться предикат в скобках , а вот следующий будет выполняться над всеми данными или уже над набором-результатом выполнения первого?
Re: ошибка проверки даты
ей-богу, Вы такую фигню спрашиваете. У Вас данные кривые, которые Вы кастуете к date - их надо исправлять, а не заниматься выкручиванием where.ничего не изменится? С т.зр. логики сначала должен выполниться предикат в скобках , а вот следующий будет выполняться над всеми данными или уже над набором-результатом выполнения первого?
ну напишите, добавьте, проверьте. на это 5 секунд потребуется.А если, написать так (добавить () )