Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 错误1690(22003):BIGINT无符号值输出_Mysql - Fatal编程技术网

Mysql 错误1690(22003):BIGINT无符号值输出

Mysql 错误1690(22003):BIGINT无符号值输出,mysql,Mysql,错误1690(22003):中的BIGINT无符号值超出范围 (dbadba\u IRIS\u警报ack\u ts- dbadba\u IRIS\u警报显示) 如何解决此错误?特别是在这种情况下,它是失败的 SELECT alertid, ackuid, severity, ticketid, From_unixtime(display_ts) AS Detection_Time,

错误1690(22003):中的BIGINT无符号值超出范围 (
dba
dba\u IRIS\u警报
ack\u ts
-
dba
dba\u IRIS\u警报
显示

如何解决此错误?特别是在这种情况下,它是失败的

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); 
样本数据

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 |
因此,我认为
ack\u ts
和/或
display\u ts
列(似乎表示Unix时间戳值)是使用
CREATE TABLE
语句中的
UNSIGNED
标志定义的(这很好,因为Unix时间戳值应该只有正值)

因此,您正在减去类型为
UNSIGNED
的列,
ack\u ts-display\u ts
的结果为负数。因此,您会遇到这样的情况:
ack\u ts
<
display\u ts

现在,有两种可能性:

  • 您可能不在查找
    确认
    显示的情况 在这种情况下,您需要向查询中添加另一个
    WHERE
    条件:

    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)'
    
  • 您可以接受负值 在这种情况下,您需要将它们强制转换为带符号的,以允许计算结果为负值:

    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); 
    
    另一个选项是将
    sql\u模式设置为使用。现在,您可以在设置模式后使用原始查询:

    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); 
    
    您可能无权全局更改此设置。因此,您可以在原始查询之前运行以下查询,以便仅对特定的客户端会话进行此更改

    SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    

    有关设置sql_模式的更多详细信息,请查看此答案:

    有关此错误的任何帮助?请在问题中添加一些示例数据。或者摆弄一把小提琴:不看数据,很难弄清楚。你在问题中添加的不是样本数据。正如所示,列
    ack\u ts
    display\u ts
    似乎存储Unix时间戳(秒)值。您能否将
    CREATE TABLE
    语句结果添加到问题中。执行
    SHOW CREATE TABLE alerts\u test
    并将此查询结果发布到问题中谢谢Madhur Bhaiya-第一个问题已解决我的问题。是确认(确认时间)应始终大于显示时间。
    SET SESSION sql_mode = 'NO_UNSIGNED_SUBTRACTION';