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

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

операция деления в запросе [D6, FB2.0]


Konrads ©   (2009-01-30 13:12:00) 

В базе данных имеются поле начала опредёлённого процесса типа TIMESTAMP и поле длительности этого процесса в минутах типа INTEGER

Нужно в запросе вывести время начала процесса и время завершения процесса

Делаю запрос:

SELECT TSTART, TSTART + TDURATION / 1440 AS TFINAL FROM DB

Никаких ошибок не возникает, за исключением того, что значения TSTART и TFINAL совершенно одинаковые, и от TDURATION никак не зависят. Если вместо операции деления к примеру поставить константу 0.000694444 - это результат деления 1 на 1440, то значение TFINAL будет на обну минуту больше чем TSTART
Пробовал и так

.... TSTART + CAST(TDURATION / 1440 AS DOUBLE PRECISION) AS TFINAL FROM DB

результат тот же


Johnmen   (2009-02-02 10:05:00) [1]


> Кщд   (02.02.09 09:41) [13]
> показал пример, как из целого делать число с плавающей

Да, но есть же стандартный CAST.


Konrads   (2009-02-02 10:03:00) [2]

всё понятно :)


Кщд   (2009-02-02 09:41:00) [3]

>Johnmen ©   (02.02.09 09:37) [12]
показал пример, как из целого делать число с плавающей
а так, конечно, Вы правы)


Johnmen   (2009-02-02 09:37:00) [4]


> Konrads   (02.02.09 07:51) [9]

Тип результата зависит от типов операндов и будет определен, как наиболее "подробный". В данном случае, если операнды integer, то и результат тоже integer.
Именно поэтому пример, приведенный Кщд  (02.02.09 09:24) [11], неверен. Т.к. результат будет приводится к numeric(9,1), а это целое по сути.
Так же неверно, например, 1440.000, ибо точности numeric(9,3) не хватит для "ощущения" минуты...


Кщд   (2009-02-02 09:24:00) [5]

>Кщд   (02.02.09 09:23) [10]
пропустил скобочки)
SELECT TSTART, TSTART + TDURATION*1.0/ (1440*1.0) AS TFINAL FROM DB


Кщд   (2009-02-02 09:23:00) [6]

>Konrads   (02.02.09 07:51) [9]
SELECT TSTART, TSTART + TDURATION*1.0/ 1440*1.0 AS TFINAL FROM DB


Konrads   (2009-02-02 07:51:00) [7]

Похоже я допёр!
Наверно деление целочисленных значений происходит так же как в паскале оаперция DIV, и естественно что разделив допустим 10 на 1440 получаем ноль, и приведение его к типу DOUBLE PRECISION конечно же ни к чему не приведёт.


Konrads   (2009-02-02 07:34:00) [8]


> Johnmen ©   (30.01.09 13:38) [1]
> TSTART + CAST(TDURATION AS DOUBLE PRECISION)  / 1440 AS
> TFINAL FROM DB

Да, так действительно работает, спасибо за помощ!

Но просто интересно, получается что тип результата операции задаёт тип первого операнда а не тип самой операции? Ведь второй операнд - константа типа INTEGER


Konrads   (2009-01-30 20:16:00) [9]

спасибо, смогу проверить завтра, отпишусь


Konrads   (2009-01-30 20:15:00) [10]

спасибо, смогу проверить завтра, отпишусь


Anatoly Podgoretsky   (2009-01-30 15:44:00) [11]

> Кщд  (30.01.2009 14:37:03)  [3]

Нафиг Оракл, для преемственности надо db2


Johnmen   (2009-01-30 14:52:00) [12]

Если правильно подходить к решению вопроса, то достаточно освоить базовую документацию (раздел про типы и их приведение) по применяемому средству. И тогда не надо будет ломать не только мозг, но и руки и глаза...


Кщд   (2009-01-30 14:37:00) [13]

>Труп Васи Доброго ©   (30.01.09 14:28) [2]
>Поставь FB2.1 и не надо будет ломать мозг.
это не излом мозга и то, что приведено в Johnmen ©   (30.01.09 13:38) [1] - стандартный ход для FB.

а советовать менять ODS (они у 2.0 и 2.1, как Вы знаете, разные), особенно если база продуктивная, услуга медвежья, на мой взгляд

впрочем, тогда уж сразу ставить oracle - запрос автора переделывать не придется


Труп Васи Доброго   (2009-01-30 14:28:00) [14]

Поставь FB2.1 и не надо будет ломать мозг. Там это решается элементарно:

SELECT TSTART, DATEADD(MINUTE,TDURATION,TSTART) AS TFINAL FROM DB


Johnmen   (2009-01-30 13:38:00) [15]

TSTART + CAST(TDURATION AS DOUBLE PRECISION)  / 1440 AS TFINAL FROM DB


Наверх

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