-
В базе данных имеются поле начала опредёлённого процесса типа 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
результат тот же
-
TSTART + CAST(TDURATION AS DOUBLE PRECISION) / 1440 AS TFINAL FROM DB
-
Поставь FB2.1 и не надо будет ломать мозг. Там это решается элементарно:
SELECT TSTART, DATEADD(MINUTE,TDURATION,TSTART) AS TFINAL FROM DB
-
>Труп Васи Доброго © (30.01.09 14:28) [2] >Поставь FB2.1 и не надо будет ломать мозг. это не излом мозга и то, что приведено в Johnmen © (30.01.09 13:38) [1] - стандартный ход для FB.
а советовать менять ODS (они у 2.0 и 2.1, как Вы знаете, разные), особенно если база продуктивная, услуга медвежья, на мой взгляд
впрочем, тогда уж сразу ставить oracle - запрос автора переделывать не придется
-
Если правильно подходить к решению вопроса, то достаточно освоить базовую документацию (раздел про типы и их приведение) по применяемому средству. И тогда не надо будет ломать не только мозг, но и руки и глаза...
-
> Кщд (30.01.2009 14:37:03) [3]
Нафиг Оракл, для преемственности надо db2
-
спасибо, смогу проверить завтра, отпишусь
-
спасибо, смогу проверить завтра, отпишусь
-
> Johnmen © (30.01.09 13:38) [1] > TSTART + CAST(TDURATION AS DOUBLE PRECISION) / 1440 AS > TFINAL FROM DB
Да, так действительно работает, спасибо за помощ!
Но просто интересно, получается что тип результата операции задаёт тип первого операнда а не тип самой операции? Ведь второй операнд - константа типа INTEGER
-
Похоже я допёр! Наверно деление целочисленных значений происходит так же как в паскале оаперция DIV, и естественно что разделив допустим 10 на 1440 получаем ноль, и приведение его к типу DOUBLE PRECISION конечно же ни к чему не приведёт.
-
>Konrads (02.02.09 07:51) [9] SELECT TSTART, TSTART + TDURATION*1.0/ 1440*1.0 AS TFINAL FROM DB
-
>Кщд (02.02.09 09:23) [10]пропустил скобочки) SELECT TSTART, TSTART + TDURATION*1.0/ (1440*1.0) AS TFINAL FROM DB
-
> Konrads (02.02.09 07:51) [9]
Тип результата зависит от типов операндов и будет определен, как наиболее "подробный". В данном случае, если операнды integer, то и результат тоже integer. Именно поэтому пример, приведенный Кщд (02.02.09 09:24) [11], неверен. Т.к. результат будет приводится к numeric(9,1), а это целое по сути. Так же неверно, например, 1440.000, ибо точности numeric(9,3) не хватит для "ощущения" минуты...
-
>Johnmen © (02.02.09 09:37) [12] показал пример, как из целого делать число с плавающей а так, конечно, Вы правы)
-
всё понятно :)
-
> Кщд (02.02.09 09:41) [13] > показал пример, как из целого делать число с плавающей
Да, но есть же стандартный CAST.
|