![]() |
| ||
|
|
Новости |
Поиск |
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-й столбец) неправильно считается?
Чего-то я не понимаю :(
Delphi basic (2006-09-01 12:16:00) [21]У меня та же версия FB, но без CAST'ов упорно не хочет правильно считать.
Desdechado (2006-09-01 12:10:00) [22]провел эксперимент на FB 1.5.3
таблицы:
CREATE TABLE CAR (
UI INTEGER NOT NULL,
FUEL_NORM_MOTO NUMERIC(5,1) NOT NULL
);
UI FUEL_NORM_MOTO
1 20,000
2 20,000
3 6,000
4 20,000
CREATE TABLE TRAVEL_SHEET (
UI INTEGER NOT NULL,
MOTO_HOUR NUMERIC(10,1) DEFAULT 0 NOT NULL
);
UI MOTO_HOUR
1 7,500
2 3,800
3 6,000
4 3,000
запрос:
select (ts.moto_hour * c.fuel_norm_moto), c.fuel_norm_moto, ts.moto_hour
from travel_sheet ts, car c
where ts.ui = c.ui
получил такое
F_1 FUEL_NORM_MOTO MOTO_HOUR
150,000 20,000 7,500
76,000 20,000 3,800
36,000 6,000 6,000
60,000 20,000 3,000
делаем выводы...
PS AFAIR, операнды автоматически приводятся к большему типу
Delphi basic (2006-09-01 11:51:00) [23]Я знаю, но "каждому свое" ©
В смысле проекту в зависимости от масштаба.
На оракле у нас корпоративная АСУ - тот еще мастодонтище :)
ANB (2006-09-01 11:43:00) [24]
> Delphi basic © (01.09.06 11:35) [5]
В оракле такие проблемы не возникают :)
Delphi basic (2006-09-01 11:35:00) [25]Вот так считает правильно:
select (cast(ts.moto_hour as numeric(10, 1)) * cast(c.fuel_norm_moto as numeric(10, 1))), c.fuel_norm_moto, ts.moto_hour,
ts.UI, ts.car
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
Это что ж, получается, придется обязательно к одному типу приводить, чтобы получить корректный результат?
Delphi basic (2006-09-01 11:18:00) [26]У всех они по UI построены.
ANB (2006-09-01 11:16:00) [27]Эта, первичные ключи неплохо бы еще напечатать . . .
Delphi basic (2006-09-01 11:14:00) [28]ОК, вот:
1-я табл
CREATE TABLE TRAVEL_SHEET (
UI INTEGER NOT NULL,
CAR INTEGER NOT NULL,
DRIVER INTEGER NOT NULL,
SUBDIVISION INTEGER NOT NULL,
EXPENSE_CIPHER INTEGER NOT NULL,
PREFIX VARCHAR(10) NOT NULL,
NUMBER INTEGER NOT NULL,
BEGIN_DATE DATE NOT NULL,
END_DATE DATE NOT NULL,
STATE INTEGER NOT NULL,
WORK_DATE DATE NOT NULL,
SPEEDOMETER_BEFORE INTEGER NOT NULL,
SPEEDOMETER_AFTER INTEGER NOT NULL,
REMAINDER_BEFORE NUMERIC(10,3) NOT NULL,
REMAINDER_AFTER NUMERIC(10,3) NOT NULL,
KM_CITY INTEGER DEFAULT 0 NOT NULL,
KM_CITY_CARGO INTEGER DEFAULT 0 NOT NULL,
CITY_CARGO NUMERIC(10,1) DEFAULT 0 NOT NULL,
KM_HIGHWAY INTEGER DEFAULT 0 NOT NULL,
KM_HIGHWAY_CARGO INTEGER DEFAULT 0 NOT NULL,
HIGHWAY_CARGO NUMERIC(10,1) DEFAULT 0 NOT NULL,
KM_FIELD INTEGER DEFAULT 0 NOT NULL,
MOTO_HOUR NUMERIC(10,1) DEFAULT 0 NOT NULL,
FUEL_ISSUED NUMERIC(10,3) DEFAULT 0 NOT NULL,
MECH_HOUR NUMERIC(10,1) DEFAULT 0 NOT NULL,
FUEL_USED NUMERIC(10,3) DEFAULT 0 NOT NULL
);
2-я табл:
CREATE TABLE CAR (
UI INTEGER NOT NULL,
MARK INTEGER NOT NULL,
CAR_TYPE INTEGER NOT NULL,
DRIVER INTEGER NOT NULL,
GSM_CARD INTEGER NOT NULL,
SUBDIVISION INTEGER NOT NULL,
GSM_TYPE INTEGER NOT NULL,
GOS_NUMBER VARCHAR(10) NOT NULL,
YEAR_ISSUE INTEGER NOT NULL,
USAGE_BEGIN DATE,
USAGE_END DATE,
FUEL_NORM NUMERIC(5,1) NOT NULL,
FUEL_NORM_MOTO NUMERIC(5,1) NOT NULL,
GARAGE_NUMBER VARCHAR(10),
AVERAGE_SPEED INTEGER DEFAULT 40 NOT NULL,
NO_USE_CORR_COEFF INTEGER DEFAULT 0 NOT NULL
);
куски данных как-то неудобочитаемы будут, особенно для 1-й табл.
ANB (2006-09-01 11:06:00) [29]приведи DDL всех таблиц и куски данных.