C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
хранение десятичгного числа, и работа с ним
Konstantine
Отправлено: 28.02.2005, 10:38


Мастер участка

Группа: Модератор
Сообщений: 545



Имеется база (инфа о компах), в которой одна из таблиц — модели винтов... её структура — ID, Name и размер. Размер самое оптимальное я придумал хранить так — число small int и 1 единица числа = 100 Мб винта, т.е если хранится 43, то это размер 4,3 Gb. поэтому поле называется dGSize cool.gif

ВНИМАНИЕ вопрос smile.gif : как это учитывать на уровне запросов, т.е. чтоб ADOQuery1->FieldByName("dGSize")->AsString вернуло что-то типа "4,3" ?

пробовал
SQL
SELECT ID, Name, dGSize/10 as dGSize FROM HDD
но оно округляет к целому, а десятичную часть отбрасывает sad.gif
AVC
Отправлено: 28.02.2005, 11:12


Ветеран

Группа: Модератор
Сообщений: 1583



Какая СУБД?
QUOTE
как это учитывать на уровне запросов, т.е. чтоб ADOQuery1->FieldByName("dGSize")->AsString вернуло что-то типа "4,3"

Как вы и написали Select dGSize / 10 as dGSize
и поставить FieldByName("dGSize")->DisplayFormat = "0.0"

QUOTE
но оно округляет к целому ...

Странно. Может округляет displayformat?
А если посмотреть тип поля — что говорит?
А явное преобразование типа
cast (... as double[numeric(12,4)])
или (dGSize + 0.0)
не помогает?

Konstantine
Отправлено: 28.02.2005, 12:03


Мастер участка

Группа: Модератор
Сообщений: 545



я пробовал в Enterprise Manager, и там тоже целое вернуло... сама база возвращает integer-ом
Konstantine
Отправлено: 28.02.2005, 12:08


Мастер участка

Группа: Модератор
Сообщений: 545



УРРЯЯ получилось:
SQL
SELECT ID, Name, (dGSize + 0.0) / 10 AS Size FROM HDD

суть была-то понятна сразу — сделать поле дробным... но вот не знал как sad.gif

ПАСИБ...
avc*
Отправлено: 28.02.2005, 12:17


Не зарегистрирован







Ну тогда и так может поможет
dGSize / 10.0 AS Size
xim
Отправлено: 28.02.2005, 18:41


Станционный диспетчер

Группа: Участник
Сообщений: 143



QUOTE
Ну тогда и так может поможет
dGSize / 10.0 AS Size

Да нет, здесь дело в определении типа при компиляции инструкции — раз базовое поле smallint? то и результат smallint. В SQL Server я бы сделал
SQL
SELECT ID, Name, cast(cast(dGSize as numeric(5,1))/10 as numeric(5,1)) as dGSize FROM HDD
AVC
Отправлено: 01.03.2005, 09:21


Ветеран

Группа: Модератор
Сообщений: 1583



2xim
Я поэтому и пишу может
Потому, что, например, для ASA6 и FB это справедливо. Так запрос
SELECT ID, ID / 10.0, ID / 10 FROM table
Дает результат 1, 0.100, 0 соответственно
А для Оracle, PostGreSQL, MaxDB, MySQL 1, 0.1, 0.1

cast без сомнения самый универсальный способ (см. мой пост №1), но зная особенности конкретного сервера, можно их использовать для сокращения записи.

Отредактировано AVC — 01/03/2005, 09:10
Konstantine
Отправлено: 01.03.2005, 13:28


Мастер участка

Группа: Модератор
Сообщений: 545



Да, забыл сказать СУБД .... SQL Server 2000..
smile.gif

ещё раз ПАСИБА всем

Вернуться в Работа с базами данных в C++Builder