Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неправильный расчет выражений в SQL


Страницы:   1 2

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-й.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо