Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 и преобразование типов / 9 сообщений из 9, страница 1 из 1
06.07.2007, 16:33
    #34644480
vofchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Есть таблица, которая содержит три столбца: SHEETCOUNT, LENGTH, WIDTH (кол-во листов, длина, ширина соотв.), тип данных в столбцах INTEGER.

Требуется найти площадь, которая считается по формуле:
SELECT BIGINT(SHEETCOUNT) * BIGINT(LENGTH) * BIGINT(WIDTH) AS S FROM ...

Все бы хорошо, но отобразить площадь надо в метрах квадратных, т.е. разделить на 10000. Делаю это так:
SELECT DOUBLE(BIGINT(SHEETCOUNT) * BIGINT(LENGTH) * BIGINT(WIDTH)) /10000 AS S FROM ...

При этом у меня остается только одни знак из всего числа :(
т.е. если подставить например такие числа DOUBLE(BIGINT(78) * BIGINT(2500) * BIGINT(1600)) /10000 то результат равен 3, а не 31200,0000.

Может кто просвятить насчет преобразования типов в DB2? Хоть ссылку какую-нибудь?
...
Рейтинг: 0 / 0
06.07.2007, 16:49
    #34644556
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Это что, в командном процессоре
Код: plaintext
values DOUBLE(BIGINT( 78 ) * BIGINT( 2500 ) * BIGINT( 1600 )) / 10000 
выдает 3, а не 31200?
Не может быть!
Версия базы и фикспак?
...
Рейтинг: 0 / 0
06.07.2007, 16:51
    #34644562
Alexey Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Если просто выполнить запрос:
Код: plaintext
VALUES(DOUBLE(BIGINT( 78 ) * BIGINT( 2500 ) * BIGINT( 1600 )) /  10000 )
Какой результат?
...
Рейтинг: 0 / 0
06.07.2007, 17:19
    #34644642
vofchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Полный набор скриптов. Запускаю из Quest Central for DB2 v4.9:

CREATE TABLE OBJ.SQUARE
(
SHEETCOUNT INTEGER,
LENGTH INTEGER,
WIDTH INTEGER
);

INSERT INTO OBJ.SQUARE (SHEETCOUNT, LENGTH, WIDTH)
VALUES (78, 2500,1600);

SELECT DOUBLE(BIGINT(SHEETCOUNT) * BIGINT(LENGTH) * BIGINT(WIDTH)) /10000 AS S
FROM OBJ.SQUARE;

Результат последнего селекта: 3

Версия DB2:
v9.1.0.356 без FixPack
...
Рейтинг: 0 / 0
06.07.2007, 17:20
    #34644644
vofchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Alexey PopovЕсли просто выполнить запрос:
Код: plaintext
VALUES(DOUBLE(BIGINT( 78 ) * BIGINT( 2500 ) * BIGINT( 1600 )) /  10000 )
Какой результат?

Результат тоже равен 3.
...
Рейтинг: 0 / 0
06.07.2007, 17:31
    #34644683
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
vofchik Полный набор скриптов. Запускаю из Quest Central for DB2 v4.9: Не надо из QC пока.
А из clp (командного процессора) DB2 если запустить?
На моей v9.1.2 (fixpack 2) все нормально работает...
...
Рейтинг: 0 / 0
06.07.2007, 17:32
    #34644687
DB2 и преобразование типов
авторЗапускаю из Quest Central for DB2 v4.9
Вот это и есть причина!
QC некорректно выводит FLOAT/DOUBLE поля.
Выполни из db2clp или db2 control center

И, насколько я помню, DB2 при умножении целых сама должна расширять тип, поэтому лишние преобразования проводить не нужно, это только понижает производительность, т.е. должно работать вот так
Код: plaintext
 VALUES(( 78  *  2500  *  1600 ) /  10000 )
...
Рейтинг: 0 / 0
06.07.2007, 17:45
    #34644719
vofchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Ура!!! Проблема действительно в Quest Central, при запуске запроса из коммандного процессора все работает.

Спасибо всем кто окликнулся.
...
Рейтинг: 0 / 0
06.07.2007, 18:00
    #34644767
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 и преобразование типов
Евгений ХабаровИ, насколько я помню, DB2 при умножении целых сама должна расширять тип, поэтому лишние преобразования проводить не нужно, это только понижает производительность, т.е. должно работать вот так
Код: plaintext
 VALUES(( 78  *  2500  *  1600 ) /  10000 )
Нет.
Для общего случая автор делает правильно:
1.
values bigint(100000)*100000*100000
не отработает, если убрать bigint (переполнение)
2.
Целочисленное деление отрезает дробную часть (тип частного от int/int = int).
Сравните
values 10/3
и
values double(10)/3
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 и преобразование типов / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]