关于MySQL时间直接相减的问题

最近发现一个问题,在使用MySQL8.0新的延迟计算方式来计算主从延迟时,如果延迟过大,计算出的结果和原先Seconds_Behind_Master的差异特别大,一开始以为是写的SQL存在问题,校验了几次发现不对,是两个时间字段计算的结果异常导致,下面是具体的验证方式

-- 创建一张包含2个时间字段的表
create table t1(dt1 datetime,dt2 datetime)

-- 插入3条数据,三条数据分别为时间差小于1分钟/时间差等于1分钟/时间差大于1分钟
insert into t1 select '2022-05-27 00:00:55','2022-05-27 00:00:00';
insert into t1 select '2022-05-27 00:01:00','2022-05-27 00:00:00';
insert into t1 select '2022-05-27 00:01:05','2022-05-27 00:00:00';

-- 表中数据示例
+---------------------+---------------------+
| dt1                 | dt2                 |
+---------------------+---------------------+
| 2022-05-27 00:00:55 | 2022-05-27 00:00:00 |
| 2022-05-27 00:01:00 | 2022-05-27 00:00:00 |
| 2022-05-27 00:01:05 | 2022-05-27 00:00:00 |
+---------------------+---------------------+

-- 对数据做各种处理查看输出的结果
SELECT DT1 - DT2 "时间直接做减法",
       CONVERT(DT1, UNSIGNED INTEGER) - CONVERT(DT2, UNSIGNED INTEGER) "将时间转换为整数做减法",
       UNIX_TIMESTAMP(DT1) - UNIX_TIMESTAMP(DT2) "转换为时间戳做减法",
       TIME_TO_SEC(TIMEDIFF(DT1, DT2)) "用时间函数处理"
  FROM T1;

+----------------+------------------------+--------------------+----------------+
| 时间直接做减法    | 将时间转换为整数做减法    | 转换为时间戳做减法    | 用时间函数处理   |
+----------------+------------------------+--------------------+----------------+
|             55 |                     55 |                 55 |             55 |
|            100 |                    100 |                 60 |             60 |
|            105 |                    105 |                 65 |             65 |
+----------------+------------------------+--------------------+----------------+

可以看到,当小于一分钟时,时间相减不存在问题
当等于或大于一分钟时,实际上MySQL把时间类型转换为了整数型做计算

  • 00:01:00 变为了100
  • 00:01:05 变为了105
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章