ОШИБКА 1690 (22003): отсутствует значение BIGINT UNSIGNED

SELECT alertid,
       ackuid,
       severity,
       ticketid,
       From_unixtime(display_ts)                           AS Detection_Time,
       From_unixtime(ack_ts)                               AS Ack_Time,
       Round(( ack_ts - display_ts ) / 60)                 AS MTTA_MINS,
       IF (Round(( ack_ts - display_ts ) / 60) > 15, 1, 0) AS SLA_MISSED
FROM   alerts_test
WHERE  display_ts > Unix_timestamp(Now() - INTERVAL 26 day)
ORDER  BY From_unixtime(display_ts); 

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(dba.DBA_IRIS_ALERTS.ack_ts - dba.DBA_IRIS_ALERTS.display_ts)'

Как устранить эту ошибку? Особенно в этом состоянии он не работает.

round((ack_ts-display_ts)/60) as MTTA_MINS,
IF ( round((ack_ts-display_ts)/60) > 15, 1, 0) as SLA_MISSED

Пример данных

+----------------------------------+-----------------+----------+-------------+---------------------+---------------------+-----------+------------+
| alertid                          | ackuid          | severity | ticketid    | Detection_Time      | Ack_Time            | MTTA_MINS | SLA_MISSED |
+----------------------------------+-----------------+----------+-------------+---------------------+---------------------+-----------+------------+
| xxxxxx                           | him            |        5 | NULL        | 2018-11-01 00:03:23 | 2018-11-01 00:06:18 |         3 |          0 |
| xxxxxx                           | him            |        5 | NULL        | 2018-11-01 00:11:08 | 2018-11-01 00:17:45 |         7 |          0 |

любая помощь по этой ошибке?

sarat 27.11.2018 14:38

Пожалуйста, добавьте к вопросу несколько примеров данных. Или настройте скрипку: db-fiddle.com Трудно понять, не глядя на данные.

Madhur Bhaiya 28.11.2018 06:25

То, что вы добавили к вопросу, не является образцом данных. Поскольку кажется, что столбцы ack_ts и display_ts хранят значение временной метки Unix (секунды). Можете ли вы добавить к вопросу результаты оператора CREATE TABLE. Сделайте SHOW CREATE TABLE alerts_test и выложите результат этого запроса на вопрос

Madhur Bhaiya 28.11.2018 07:15
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
419
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От Обработка выхода за пределы допустимого диапазона и переполнения:

Subtraction between integer values, where one is of type UNSIGNED, produces an unsigned result by default. If the result would otherwise have been negative, an error results:

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

Итак, я думаю, что столбцы ack_ts и / или display_ts, которые, кажется, представляют значения временных меток Unix, определены с помощью флага UNSIGNED в вашем операторе CREATE TABLE (что хорошо, так как значения Unix Timestamp должны быть только положительными).

Итак, вы вычитаете столбцы типа UNSIGNED, а результат ack_ts - display_ts отрицательный. Итак, вы получаете случаи, когда ack_ts <display_ts.

Теперь есть две возможности:

  1. Вы может не быть ищите случаи, когда ack_ts <display_ts.

В этом случае вам нужно будет добавить в запрос еще одно условие WHERE:

SELECT alertid,
       ackuid,
       severity,
       ticketid,
       From_unixtime(display_ts)                           AS Detection_Time,
       From_unixtime(ack_ts)                               AS Ack_Time,
       Round(( ack_ts - display_ts ) / 60)                 AS MTTA_MINS,
       IF (Round(( ack_ts - display_ts ) / 60) > 15, 1, 0) AS SLA_MISSED
FROM   alerts_test
WHERE  display_ts > Unix_timestamp(Now() - INTERVAL 26 day) AND 
       ack_ts >= display_ts   /* added one more condition to remove negative cases */
ORDER  BY From_unixtime(display_ts); 
  1. Вы в порядке с отрицательными значениями.

В этом случае вам нужно будет преобразовать их в SIGNED, чтобы результат вычислений был отрицательным:

SELECT alertid,
       ackuid,
       severity,
       ticketid,
       From_unixtime(display_ts)                           AS Detection_Time,
       From_unixtime(ack_ts)                               AS Ack_Time,
       Round(( CAST(ack_ts AS SIGNED) - CAST(display_ts AS SIGNED) ) / 60) AS MTTA_MINS,
       IF (Round(( CAST(ack_ts AS SIGNED) - CAST(display_ts AS SIGNED) ) / 60) > 15, 1, 0) AS SLA_MISSED
FROM   alerts_test
WHERE  display_ts > Unix_timestamp(Now() - INTERVAL 26 day) 
ORDER  BY From_unixtime(display_ts); 

Другой вариант - настроить sql_mode на использование NO_UNSIGNED_SUBTRACTION. Теперь вы можете использовать исходный запрос после установки режима:

SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';

У вас может не быть доступа для изменения этого параметра глобально. Таким образом, вы можете выполнить следующий запрос непосредственно перед исходным запросом, чтобы внести это изменение только для определенного клиентского сеанса.

SET SESSION sql_mode = 'NO_UNSIGNED_SUBTRACTION';

Проверьте этот ответ для получения дополнительных сведений о настройке sql_modes: https://stackoverflow.com/a/26104070/2469308

Спасибо, Мадхур Бхайя - Первый решил мою проблему. Да, ack_ts (время подтверждения) всегда должно быть больше, чем время отображения.

sarat 28.11.2018 13:26

Другие вопросы по теме