ошибка проверки даты

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

ошибка проверки даты

Сообщение 2hands » 23 июл 2009, 15:49

Добрый день!
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)".
Как такое может быть? И как это вылечить?
Спасибо

Prog
Сообщения: 12
Зарегистрирован: 15 июл 2009, 11:01

Re: ошибка проверки даты

Сообщение Prog » 23 июл 2009, 18:06

Полагаю, тут не будут приводить многочисленные способы обхода этой "лишней" проверки, пока не убедятся, что по-нормальному сделать нельзя.

Так что лучше сразу написать:

* Зачем поле даты хранится в строке? Почему нельзя его перевести в дату (да, изменив структуру базы)?
* Если и правда нельзя менять, почему бы не добавить отдельное поле с нормальной датой?
* Почему нельзя исправить кривую дату?
* Если вообще всё нельзя, то какие индексы у таблицы и каково примерное число записей: всего; попадающих под условие per in (..); попадающих под DATA_C > нужной_даты; попадающих под оба условия.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: ошибка проверки даты

Сообщение kdv » 23 июл 2009, 18:35

порядок проверки предикатов в 1.5 не гарантируется. так что может быть, что сначала проверяется cast, а потом уже in.

2hands
Сообщения: 21
Зарегистрирован: 06 дек 2005, 14:42

Re: ошибка проверки даты

Сообщение 2hands » 28 июл 2009, 14:12

2kdv
Спасибо за информацию. Как обойти ситуацию буду решать.
А если, написать так (добавить () )

select count(*) from t1
where (per in (1,3)) and cast (DATA_C as date )>'27.02.2009'

ничего не изменится? С т.зр. логики сначала должен выполниться предикат в скобках , а вот следующий будет выполняться над всеми данными или уже над набором-результатом выполнения первого?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: ошибка проверки даты

Сообщение kdv » 29 июл 2009, 10:54

ничего не изменится? С т.зр. логики сначала должен выполниться предикат в скобках , а вот следующий будет выполняться над всеми данными или уже над набором-результатом выполнения первого?
ей-богу, Вы такую фигню спрашиваете. У Вас данные кривые, которые Вы кастуете к date - их надо исправлять, а не заниматься выкручиванием where.
А если, написать так (добавить () )
ну напишите, добавьте, проверьте. на это 5 секунд потребуется.

Ответить