0
点赞
收藏
分享

微信扫一扫

Mysql验证数据的常用程序

钟罗敏 2022-01-28 阅读 15


Mysql验证数据的常用SQL

问题一

1.1问题描述

如果有一个设备,其变动关系呈之字形,也就是说,其上一条记录的​​start_date​​​ = 该设备的下一条记录的​​end_date​​。但是如何验证这个start_date与end_date直接的变化是连续的呢?请看下面一条数据:

mysql> select pit_key,device_key,device_id,start_date,end_date from pit_device_shop_temp where end_date = '9999-12-31' limit 1;
+---------+------------+--------------+---------------------+---------------------+
| pit_key | device_key | device_id | start_date | end_date |
+---------+------------+--------------+---------------------+---------------------+
| 1 | 7 | 00S92HEA2SD1 | 2018-05-01 00:00:00 | 9999-12-31 00:00:00 |
+---------+------------+--------------+---------------------+---------------------+
1 row in set (0.00 sec)

查询这个device_key所对应的所有device的记录 ,如下所示:

mysql>  select pit_key,device_key,device_id,start_date,end_date from pit_device_shop_temp where device_key = 7;
+---------+------------+--------------+---------------------+---------------------+
| pit_key | device_key | device_id | start_date | end_date |
+---------+------------+--------------+---------------------+---------------------+
| 586454 | 7 | 74A34AA1D5A7 | 2018-07-04 00:00:00 | 2018-08-28 00:00:00 |
| 713795 | 7 | 74A34AA1D5A7 | 2018-08-28 00:00:00 | 9999-12-31 00:00:00 |
+---------+------------+--------------+---------------------+---------------------+
2 rows in set (0.66 sec)

现在我们需要检验的就是这个​​2018-07-04 00:00:00​​​ -> ​​2018-08-28 00:00:00​​​ 以及​​2018-08-28 00:00:00​​​ -> ​​9999-12-31 00:00:00​​这个过程是否是连续的?

1.2 解决方案

测试思路大致如下:


  • step 1:求出某设备最小日期和最大日期之间的差距
  • step 2:求出设备每行的日期变化差之和
  • 比较step 1和step 2是否相等
    得到如下sql:

select device_id
from pit_device_shop_temp
group by device_id
having timestampdiff(day,min(start_date),max(end_date)) <> (sum(timestampdiff(day,start_date,end_date)));
1.3 核对结果

如果根据上述的SQL得到的值是​​Empty Set​​,那么表示变动的过程是正确的。



举报

相关推荐

0 条评论