mysql - 错误 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);
错误 1690 (22003):BIGINT UNSIGNED 值超出了“(…… -
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 |
解决方案
默认情况下,整数值之间的减法(其中一个是 UNSIGNED 类型)会产生无符号结果。如果结果本来是否定的,则会导致错误:
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)'
因此,我认为似乎代表 Unix Timestamp 值的ack_ts
和/或列是在您的语句中使用flag定义的(这很好,因为 Unix Timestamp 值应该仅为正数)。display_ts
UNSIGNED
CREATE TABLE
所以,你减去类型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
为 using NO_UNSIGNED_SUBTRACTION
。现在,您可以在设置模式后使用原始查询:
SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
您可能无权在全局范围内更改此设置。因此,您可以在原始查询之前运行以下查询,以便仅针对特定客户端会话进行此更改。
SET SESSION sql_mode = 'NO_UNSIGNED_SUBTRACTION';
检查此答案以获取有关设置 sql_modes 的更多详细信息:https ://stackoverflow.com/a/26104070/2469308
推荐阅读
- perl - Perl 错误:无法为模块 GD 加载 GD.xs.dll
- ruby-on-rails - 使用 group_by 但返回一个哈希数组
- reactjs - ReactJS 如何调用打开简单模态的函数?
- c# - 方法没有重载 ... 需要 10 个参数。但是参数/参数匹配
- lua - Lua 中的代码注入是否可以仅使用变量定义来执行?
- opengl - 如何在 WSL 上更新 OpenGL 通行证 2.1 版?
- r - 渲染后重新隐藏条件闪亮输出
- concatenation - *open* 工作簿上的间接和连接 #ref 错误
- python - 如何在不知道参数名称的情况下将参数提供给多参数函数?Python
- typescript - 使用 nest.js 在 AWS Lambda 中获取 Cognito 数据(即 requestContext)