BIGINT UNSIGNED value is out of range

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 3 ноя 2018.

Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    463
    Симпатии:
    1.168
    Приветствую,

    Есть такой запрос:
    Код:
    SELECT
        round((`unsuccess_time`-`success_time`) / 60) as x,
        COUNT(*) as y
    FROM `sites`
    WHERE
        `success_time`>0
    GROUP BY x
    Запрос выдает ошибку
    Код:
    #1690 - BIGINT UNSIGNED value is out of range in '(`unsuccess_time` - `success_time`)'
    Без GROUP BY ошибки нет.

    Поля unsuccess_time и success_time INT(11) UNSIGNED, в них хранится unix time

    По ответам тут https://stackoverflow.com/questions/11698613/bigint-unsigned-value-is-out-of-range-my-sql/11704174 пытался как-то исправить ситуацию, но никак не получилось, хотя в итоге уже везде поставил CAST

    Как выполнить запрос без ошибок?
     
  2. ElenaBeck123!

    ElenaBeck123! Создатель

    Регистр.:
    24 май 2017
    Сообщения:
    18
    Симпатии:
    1
    да вы уже ответили (наверное не подозревая об этом) на свой вопрос, Unsigned тип не может быть в минусе. У ним минимум это 0. А при вычитании unsuccess_time - success_time у вас скорее всего получается значение меньше нуля. Или измените поля на SIGNED или проверяйте вычитание...
     
    Q_BASIC нравится это.
  3. bettelli

    bettelli Создатель

    Регистр.:
    16 сен 2017
    Сообщения:
    28
    Симпатии:
    3
    This is the solution from the post in https://stackoverflow.com/questions/11698613/bigint-unsigned-value-is-out-of-range-my-sql/11704174 To generalise the rule, MySQL will now refuse to substract an UNSIGNED operand from a SIGNED one.
    Example : SELECT A - B; will fail if A is SIGNED whereas B is UNSIGNED.
    Workarounds: Add 1.0 factor to the signed operand, so it implicitly casts it to FLOAT, or use CAST (B AS SIGNED), or even swap (B - A) and change the algorithm accordingly. This works for me.