![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по БД [D7, D2005, XP]
Progr © (2007-09-06 21:07:00)Доброго времени суток, мастера.
Возник один вопрос, который я не могу понять. Пишу небольшую БД, исходный файл БД в IB. Использую IBquery компонент. Так Вот, почему:
{select * from ANM_Saon
Where (CHISLO >= :data1 and CHISLO <= :data2) and
(int1 = :Tint1) and
(int2 = :Tint2) and
(int3 = :Tint3) and
(int4 = :Tint4) and
(int5= :Tint5)} этот код не делает выборку. CHISLO типа DATE, а все остальные поля int1-5 SmallINT. Все параметизированные данные задаю верно. Но выборки нет. А вот код:
{select * from ANM_Saon
Where (CHISLO >= :data1 and CHISLO <= :data2)
Union
select * from ANM_Saon where
(int1 = :Tint1) and
(int2 = :Tint2) and
(int3 = :Tint3) and
(int4 = :Tint4) and
(int5= :Tint5)}
работает. Причем не всегда правильно. Я обратил внимание если data1=data2 то условия в секции Union не используются.
Если честно, то первый вариант мне больлше нравится, так как в запросе при построении запроса на выборку фильтр использует все переменные.
Не подскажите, мастера, что я делаю не так, почему первый код не работоспособен .
Заранее благодарю. С уважением...
Anatoly Podgoretsky (2007-09-06 22:05:00) [21]> Progr (06.09.2007 21:50:05) [5]
Ты сам написал, что не работает (не всегда именно это и означает)
Повторяю еще раз, нет записей под условие.
Это и доказывает второй пример.
Запись с датой есть, а с INT нет
При первом примере это явно видно.
MsGuns (2007-09-06 21:57:00) [22]Надо указывать либо >=[<Дата> 00:00:00] and <=[<Дата> 23:59:59]
либо использовать функции преобразования чтобы сверять только числа, но не время
MsGuns (2007-09-06 21:54:00) [23]>Progr (06.09.07 21:50) [5]
>Не понял. Расшифруйте пожалуйста.
>С уважением.
Запрос типа
Select ..
where FDate=:p1
с ParamByName('p1').asDate := NOW
ничего не вернет, хотя в базе может быть куча записей с этой датой.
Все дело во времени - hh:mm:ss
Progr (2007-09-06 21:50:00) [24]>>>В дате сеть еще время
Не понял. Расшифруйте пожалуйста.
С уважением.
А почему тогда второй работает при таких же условиях
MsGuns (2007-09-06 21:40:00) [25]В дате сеть еще время
Progr (2007-09-06 21:38:00) [26]>>> Первый код не работает, поскольку нет записей удовлетворяющих условию.
Но почему. Если я задаю между 10.08.07 и 10.09.07.
Поля в базе int принимают либо 1 либо 0. Соответственно на форме в программе ввожу эти переменные. Но в базе есть запись удовлетворяющая этому условию.
поле:
CHISLO int1 int2 int3 int4 int5
15.08.07. 1 0 1 0 0
База сама шире. Есть дополнительные поля, которые я здесь не привожу так фильтрация по ним не происходит.
Я соответственно в запрос передаю параметры int1-5 и дату соответствующие данной записи. Параметры, передаваемые в запрос, удовлетворяют условию приведенной выше записи. То есть должна вернуться выборка состоящая из этой записи.
Так почему не работает?
С уважением..
Desdechado (2007-09-06 21:30:00) [27]Нужно быть осторожным с типом SMALLINT, т.к. параметры нужно явно типизироватьи явно присваивать так, чтоб не получилось, например, как будто это Integer.
Секции UNION не существует. Это способ объединения результатов двух запросов. Т.о. 1-й и 2-й код делают совершенно разные вещи:
1. выбирает то, что удовлетворяет обоим условиям
2. выбирает то, что удовлетворяет только 1-му условию, а затем дополняет результат тем, что удовлетворяет только 2-му условию
Anatoly Podgoretsky (2007-09-06 21:13:00) [28]> Progr (06.09.2007 21:07:00) [0]
Первый код не работает, поскольку нет записей удовлетворяющих условию.