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 |
Пожалуйста, добавьте к вопросу несколько примеров данных. Или настройте скрипку: db-fiddle.com Трудно понять, не глядя на данные.
То, что вы добавили к вопросу, не является образцом данных. Поскольку кажется, что столбцы ack_ts и display_ts хранят значение временной метки Unix (секунды). Можете ли вы добавить к вопросу результаты оператора CREATE TABLE. Сделайте SHOW CREATE TABLE alerts_test и выложите результат этого запроса на вопрос






От Обработка выхода за пределы допустимого диапазона и переполнения:
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.
Теперь есть две возможности:
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);
В этом случае вам нужно будет преобразовать их в 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 (время подтверждения) всегда должно быть больше, чем время отображения.
любая помощь по этой ошибке?