BIGINT UNSIGNED value is out of range

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.239
Приветствую,

Есть такой запрос:
Код:
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

По ответам тут Для просмотра ссылки Войди или Зарегистрируйся пытался как-то исправить ситуацию, но никак не получилось, хотя в итоге уже везде поставил CAST

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

ElenaBeck123!

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

bettelli

Создатель
Регистрация
16 Сен 2017
Сообщения
26
Реакции
7
This is the solution from the post in Для просмотра ссылки Войди или Зарегистрируйся 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.
 
Сверху