Форум: "Базы";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Внизоперация деления в запросе Найти похожие ветки
← →
Konrads (2009-01-30 13:12) [0]В базе данных имеются поле начала опредёлённого процесса типа 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-01-30 13:38) [1]
TSTART + CAST(TDURATION AS DOUBLE PRECISION) / 1440 AS TFINAL FROM DB
← →
Труп Васи Доброго © (2009-01-30 14:28) [2]Поставь FB2.1 и не надо будет ломать мозг. Там это решается элементарно:
SELECT TSTART, DATEADD(MINUTE,TDURATION,TSTART) AS TFINAL FROM DB
← →
Кщд (2009-01-30 14:37) [3]>Труп Васи Доброго © (30.01.09 14:28) [2]
>Поставь FB2.1 и не надо будет ломать мозг.
это не излом мозга и то, что приведено в Johnmen © (30.01.09 13:38) [1] - стандартный ход для FB.
а советовать менять ODS (они у 2.0 и 2.1, как Вы знаете, разные), особенно если база продуктивная, услуга медвежья, на мой взгляд
впрочем, тогда уж сразу ставить oracle - запрос автора переделывать не придется
← →
Johnmen © (2009-01-30 14:52) [4]Если правильно подходить к решению вопроса, то достаточно освоить базовую документацию (раздел про типы и их приведение) по применяемому средству. И тогда не надо будет ломать не только мозг, но и руки и глаза...
← →
Anatoly Podgoretsky © (2009-01-30 15:44) [5]> Кщд (30.01.2009 14:37:03) [3]
Нафиг Оракл, для преемственности надо db2
← →
Konrads (2009-01-30 20:15) [6]спасибо, смогу проверить завтра, отпишусь
← →
Konrads (2009-01-30 20:16) [7]спасибо, смогу проверить завтра, отпишусь
← →
Konrads (2009-02-02 07:34) [8]
> Johnmen © (30.01.09 13:38) [1]
> TSTART + CAST(TDURATION AS DOUBLE PRECISION) / 1440 AS
> TFINAL FROM DB
Да, так действительно работает, спасибо за помощ!
Но просто интересно, получается что тип результата операции задаёт тип первого операнда а не тип самой операции? Ведь второй операнд - константа типа INTEGER
← →
Konrads (2009-02-02 07:51) [9]Похоже я допёр!
Наверно деление целочисленных значений происходит так же как в паскале оаперция DIV, и естественно что разделив допустим 10 на 1440 получаем ноль, и приведение его к типу DOUBLE PRECISION конечно же ни к чему не приведёт.
← →
Кщд (2009-02-02 09:23) [10]>Konrads (02.02.09 07:51) [9]
SELECT TSTART, TSTART + TDURATION*1.0/ 1440*1.0 AS TFINAL FROM DB
← →
Кщд (2009-02-02 09:24) [11]>Кщд (02.02.09 09:23) [10]
пропустил скобочки)SELECT TSTART, TSTART + TDURATION*1.0/ (1440*1.0) AS TFINAL FROM DB
← →
Johnmen © (2009-02-02 09:37) [12]
> 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:41) [13]>Johnmen © (02.02.09 09:37) [12]
показал пример, как из целого делать число с плавающей
а так, конечно, Вы правы)
← →
Konrads (2009-02-02 10:03) [14]всё понятно :)
← →
Johnmen © (2009-02-02 10:05) [15]
> Кщд (02.02.09 09:41) [13]
> показал пример, как из целого делать число с плавающей
Да, но есть же стандартный CAST.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c