![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неправильный расчет выражений в SQL
Delphi basic © (2006-09-01 10:59:00)В Firebird выполняю следующий запрос:
select (ts.moto_hour * c.fuel_norm_moto), c.fuel_norm_moto, ts.moto_hour
from travel_sheet ts, car c, subdivision s
where ts.car = c.ui and
ts.subdivision = s.ui and
extract(month from ts.work_date) = 7 and
extract(year from ts.work_date) = 2006 and
s.code = 'СМИТ' and
ts.state = 1
результаты:
150 20 7,5
75 20 3,8
60 6 6
60 20 3
почему выражение (1-й столбец) неправильно считается?
Чего-то я не понимаю :(
atruhin (2006-09-07 20:34:00) [1]Да я то знаю, все можно сделать отдельно, но бэкап это все делает сразу, автоматически.
Desdechado (2006-09-07 17:35:00) [2]> пересчет статистики индексов.
Перестройка индексов. Пересчет статистики можно сделать и без b/r командой SET STATISTICS. А в бэкапе индексы не хранятся, только правила их построения.
Хотя и индексы можно перестроить (INACTIVE/ACTIVE), но это уже другая песня.
atruhin (2006-09-07 17:16:00) [3]> А то ведь предел нумерации транзакций когда-то же наступит...
Ну, ну :) Счетчик = integer;
Основная цель b/r - удаление зависших транзакций, пересчет статистики индексов. (Это для аатора)
Desdechado (2006-09-07 15:36:00) [4]> При нормальной работе база может работать годами без b/r
Особенно в режиме R/O с компашки :)
А то ведь предел нумерации транзакций когда-то же наступит...
> Это известный глюк IB.
Документированный глюк - это фича!
atruhin (2006-09-07 15:33:00) [5]> [23] Delphi basic © (06.09.06 11:06)
> Получается, если не сделал backup/restore в какой-то (какой?
> ) момент времени, можно получить сюрпризы
Не совсем так. Ошибки базы бывают как правило после "падения" сервера, а также восле модификации структуры БД. В некоторых случаях когда в таблице есть данные, и ты изменяешь тип поля, в поле могут оказаться неправильные данные. Это известный глюк IB. При нормальной работе база может работать годами без b/r. ( видел такие случаи)
Desdechado (2006-09-06 13:35:00) [6]> можно получить сюрпризы с непонятно откуда растущими ногами
Сюрпризы всегда возможны. А b/r вполне нормальная процедура, рекомендуется для периодичного выполнения. Можно и gfix.
Delphi basic (2006-09-06 11:06:00) [7]
> Виталий Панасенко (02.09.06 11:29) [19]
Сделал, теперь нормально считает.
> atruhin © (05.09.06 17:02) [21]
> А вот то, что у автора похоже на
> > [19] Виталий Панасенко (02.09.06 11:29)
И все же почему так странно себя ведет?
Получается, если не сделал backup/restore в какой-то (какой?) момент времени, можно получить сюрпризы с непонятно откуда растущими ногами вроде того, который был у меня? Ведь остальное все нормально работало.
Desdechado (2006-09-05 17:07:00) [8]Комбинируем
> FUEL_NORM_MOTO NUMERIC(5,1)
и
>Precision Dialect 1 Dialect 3
>5 to 9 INTEGER INTEGER
и
kaif © (05.09.06 01:09) [20]
Может, каким-то боком и вылазит?
atruhin (2006-09-05 17:02:00) [9]> зачастую FB рассматривает результат как INTEGER.
Вроде не зачастую, а всегда. Это документированно.
А вот то, что у автора похоже на
> [19] Виталий Панасенко (02.09.06 11:29)
kaif (2006-09-05 01:09:00) [10]Я сталкивался с подобной ошибкой.
Если перемножается INTEGER и DECIMAL (NUMERIC)
зачастую FB рассматривает результат как INTEGER.
Использование CAST всегда спасает.
Виталий Панасенко (2006-09-02 11:29:00) [11]backup/restore не делал ? может, база рухнула ?
Delphi basic (2006-09-01 14:20:00) [12]
> Delphi basic © (01.09.06 13:03) [14]
Но результаты [14] все равно непонятны...
Если уж считать неправильно, то делать это применительно ко всем базам на одном и том же сервере...
Delphi basic (2006-09-01 14:09:00) [13]
> unknown © (01.09.06 13:57) [15]
Точно? Я в хелпе интербейзовском вычитал много чего интересного, например, то, что numeric для size <= 9 хранит как Integer для обоих диалектов, а начиная с size 10 - как double precision/64 bit в зависимости от диалекта.
Desdechado (2006-09-01 14:06:00) [14]да, подзабыл
просто с фиксированной точкой да и 3-м диалектом редко пользуюсь
Precision Dialect 1 Dialect 3
1 to 4 SMALLINT for NUMERIC datatypes SMALLINT
INTEGER for DECIMAL datatypes
5 to 9 INTEGER INTEGER
10 to 18 DOUBLE PRECISION INT64
Но это всего лишь способ ХРАНЕНИЯ, а не выполнения матем. операций
unknown (2006-09-01 13:57:00) [15]
> Desdechado © (01.09.06 12:36) [13]
Очень даже влияет :
NUMERIC
диалект 3 - 64 bit int
диалект 1 - double precision
Delphi basic (2006-09-01 13:03:00) [16]
> Desdechado © (01.09.06 12:10) [8]
Провел тот же эксперимент с двумя базами, с 1-м и 3-м диалектом. Считает правильно... Так какого рожна в исходной базе ему надо?
Desdechado (2006-09-01 12:36:00) [17]диалект 1, но имхо на числа это не должно влиять
Delphi basic (2006-09-01 12:32:00) [18]В IBExpert'е
Виталий Панасенко (2006-09-01 12:23:00) [19]Не через БДЕ случаем ?
Delphi basic (2006-09-01 12:18:00) [20]
> Desdechado © (01.09.06 12:10) [8]
Какой диалект у базы? У моей 3-й.