Конференция "Базы" » операция деления в запросе [D6, FB2.0]
 
  • Konrads (30.01.09 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 © (30.01.09 13:38) [1]
    TSTART + CAST(TDURATION AS DOUBLE PRECISION)  / 1440 AS TFINAL FROM DB

  • Труп Васи Доброго © (30.01.09 14:28) [2]
    Поставь FB2.1 и не надо будет ломать мозг. Там это решается элементарно:

    SELECT TSTART, DATEADD(MINUTE,TDURATION,TSTART) AS TFINAL FROM DB
  • Кщд (30.01.09 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 © (30.01.09 14:52) [4]
    Если правильно подходить к решению вопроса, то достаточно освоить базовую документацию (раздел про типы и их приведение) по применяемому средству. И тогда не надо будет ломать не только мозг, но и руки и глаза...
  • Anatoly Podgoretsky © (30.01.09 15:44) [5]
    > Кщд  (30.01.2009 14:37:03)  [3]

    Нафиг Оракл, для преемственности надо db2
  • Konrads (30.01.09 20:15) [6]
    спасибо, смогу проверить завтра, отпишусь
  • Konrads (30.01.09 20:16) [7]
    спасибо, смогу проверить завтра, отпишусь
  • Konrads (02.02.09 07:34) [8]

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

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

    Но просто интересно, получается что тип результата операции задаёт тип первого операнда а не тип самой операции? Ведь второй операнд - константа типа INTEGER
  • Konrads (02.02.09 07:51) [9]
    Похоже я допёр!
    Наверно деление целочисленных значений происходит так же как в паскале оаперция DIV, и естественно что разделив допустим 10 на 1440 получаем ноль, и приведение его к типу DOUBLE PRECISION конечно же ни к чему не приведёт.
  • Кщд (02.02.09 09:23) [10]
    >Konrads   (02.02.09 07:51) [9]
    SELECT TSTART, TSTART + TDURATION*1.0/ 1440*1.0 AS TFINAL FROM DB
  • Кщд (02.02.09 09:24) [11]
    >Кщд   (02.02.09 09:23) [10]
    пропустил скобочки)
    SELECT TSTART, TSTART + TDURATION*1.0/ (1440*1.0) AS TFINAL FROM DB

  • Johnmen © (02.02.09 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) не хватит для "ощущения" минуты...
  • Кщд (02.02.09 09:41) [13]
    >Johnmen ©   (02.02.09 09:37) [12]
    показал пример, как из целого делать число с плавающей
    а так, конечно, Вы правы)
  • Konrads (02.02.09 10:03) [14]
    всё понятно :)
  • Johnmen © (02.02.09 10:05) [15]

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

    Да, но есть же стандартный CAST.
 
Конференция "Базы" » операция деления в запросе [D6, FB2.0]
Есть новые Нет новых   [134477   +43][b:0][p:0.001]