在MySQL中基于时间的数据隔离

问题描述

我有要在其中插入数据的表。我有一个源类型,它告诉数据来自哪个源。源有两种类型:1.包含WAPDA,太阳能和发电机作为源的电源;以及2.实际用户的计量表。转动仪表时,其数据会与日期和时间一起保存,同步仪表数据也会与日期和时间一起保存。信号源和同步仪表的日期和时间将相同,唯一的区别是信号源的类型

始终应该将同步仪表设为turned on,而一次只能使用一个turned on。这是一些示例数据,以及DB Fiddle相同的数据:

CREATE TABLE `mdc_meters_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`msn` varchar(100) DEFAULT NULL,`cust_id` varchar(100) DEFAULT NULL,`p_id` varchar(100) DEFAULT NULL,`device_id` varchar(100) DEFAULT NULL,`voltage_p1` varchar(100) DEFAULT NULL,`voltage_p2` varchar(100) DEFAULT NULL,`voltage_p3` varchar(100) DEFAULT NULL,`current_p1` varchar(100) DEFAULT NULL,`current_p2` varchar(100) DEFAULT NULL,`current_p3` varchar(100) DEFAULT NULL,`pow_fact_t` varchar(100) DEFAULT NULL,`pow_fact_t1` varchar(100) DEFAULT NULL,`pow_fact_t2` varchar(100) DEFAULT NULL,`pow_fact_t3` varchar(100) DEFAULT NULL,`grid_freq` varchar(100) DEFAULT NULL,`act_pow_t` varchar(100) DEFAULT NULL,`act_pow_t1` varchar(100) DEFAULT NULL,`act_pow_t2` varchar(100) DEFAULT NULL,`act_pow_t3` varchar(100) DEFAULT NULL,`react_pow_t` varchar(100) DEFAULT NULL,`react_pow_t1` varchar(100) DEFAULT NULL,`react_pow_t2` varchar(100) DEFAULT NULL,`react_pow_t3` varchar(100) DEFAULT NULL,`apprt_pow_t` varchar(100) DEFAULT NULL,`apprt_pow_t1` varchar(100) DEFAULT NULL,`apprt_pow_t2` varchar(100) DEFAULT NULL,`apprt_pow_t3` varchar(100) DEFAULT NULL,`kwh_t` varchar(100) DEFAULT NULL,`kwh_t1` varchar(100) DEFAULT NULL,`kwh_t2` varchar(100) DEFAULT NULL,`Kwh_t3` varchar(100) DEFAULT NULL,`fwd_act_enrg_t` varchar(100) DEFAULT NULL,`fwd_act_enrg_t1` varchar(100) DEFAULT NULL,`fwd_act_enrg_t2` varchar(100) DEFAULT NULL,`fwd_act_enrg_t3` varchar(100) DEFAULT NULL,`rev_act_enrg_t` varchar(100) DEFAULT NULL,`rev_act_enrg_t1` varchar(100) DEFAULT NULL,`rev_act_enrg_t2` varchar(100) DEFAULT NULL,`rev_act_enrg_t3` varchar(100) DEFAULT NULL,`react_enrg_t` varchar(100) DEFAULT NULL,`react_enrg_t1` varchar(100) DEFAULT NULL,`react_enrg_t2` varchar(100) DEFAULT NULL,`react_enrg_t3` varchar(100) DEFAULT NULL,`fwd_react_enrg_t` varchar(100) DEFAULT NULL,`fwd_react_enrg_t1` varchar(100) DEFAULT NULL,`fwd_react_enrg_t2` varchar(100) DEFAULT NULL,`fwd_react_enrg_t3` varchar(100) DEFAULT NULL,`rev_react_enrg_t` varchar(100) DEFAULT NULL,`rev_react_enrg_t1` varchar(100) DEFAULT NULL,`rev_react_enrg_t2` varchar(100) DEFAULT NULL,`rev_react_enrg_t3` varchar(100) DEFAULT NULL,`d_type` varchar(100) DEFAULT NULL,`data_date_time` datetime DEFAULT NULL,`s_type` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18787 DEFAULT CHARSET=latin1;

/*Data for the table `mdc_meters_data` */

insert  into `mdc_meters_data`(`id`,`msn`,`cust_id`,`p_id`,`device_id`,`voltage_p1`,`voltage_p2`,`voltage_p3`,`current_p1`,`current_p2`,`current_p3`,`pow_fact_t`,`pow_fact_t1`,`pow_fact_t2`,`pow_fact_t3`,`grid_freq`,`act_pow_t`,`act_pow_t1`,`act_pow_t2`,`act_pow_t3`,`react_pow_t`,`react_pow_t1`,`react_pow_t2`,`react_pow_t3`,`apprt_pow_t`,`apprt_pow_t1`,`apprt_pow_t2`,`apprt_pow_t3`,`kwh_t`,`kwh_t1`,`kwh_t2`,`Kwh_t3`,`fwd_act_enrg_t`,`fwd_act_enrg_t1`,`fwd_act_enrg_t2`,`fwd_act_enrg_t3`,`rev_act_enrg_t`,`rev_act_enrg_t1`,`rev_act_enrg_t2`,`rev_act_enrg_t3`,`react_enrg_t`,`react_enrg_t1`,`react_enrg_t2`,`react_enrg_t3`,`fwd_react_enrg_t`,`fwd_react_enrg_t1`,`fwd_react_enrg_t2`,`fwd_react_enrg_t3`,`rev_react_enrg_t`,`rev_react_enrg_t1`,`rev_react_enrg_t2`,`rev_react_enrg_t3`,`d_type`,`data_date_time`,`s_type`) values (18751,'00209703','','01','03','220','0','3.02','0.85','49.9','1.072','0.153','0.620','378.01',NULL,'15.11','12.12','300','2020-08-31 14:00:00','WAPDA'),(18752,'3.04','0.621','380','240','15.15','12.13','2020-08-31 14:10:00',(18753,'3.06','1.370','0.155','0.860','382','15.17','12.15','2020-08-31 14:20:00',(18754,'3.07','1.372','0.157','0.863','384','15.19','12.17','2020-08-31 14:30:00',(18755,'00209704','3.09','1.375','0.161','0.865','2','15.21','386\r\n','12.19','Generator'),(18756,'3.11','1.377','0.163','0.867','4','15.23','388\r\n','12.21','2020-08-31 14:40:00',(18757,'3.13','1.379','0.165','0.869','6','15.25','390\r\n','12.23','2020-08-31 14:50:00',(18758,'3.15','1.381','0.167','0.871','8','15.27','392\r\n','12.25','2020-08-31 15:00:00',(18759,'00209706','37010114713','06','2.01','0.418','0.025','0.419','278.01','8.56','6.65','Sync Meter'),(18760,'2.02','279',(18761,'2.03','0.715','0.026','0.657','280','6.66',(18762,'0.716','0.027','0.659','281','8.57','6.67',(18763,'00209707','37010114710','07','1.01','0.654','0.128','0.201','100','6.55','5.47',(18764,'1.02','0.202','101','6.59','5.48',(18765,'1.03','0.655','0.129','0.203','102','6.61','5.49',(18766,'1.04','0.656','0.130','0.204','103','6.62','5.50',(18767,'2.04','0.718','0.030','0.660','282','8.58','6.68',(18768,'2.05','0.719','0.031','0.661','0.662','283','8.59','6.69',(18769,'2.06','0.720','0.032','284','8.60','6.70',(18770,'2.07','0.721','0.033','0.663','285','8.61','6.71',(18771,'2.08','0.722','0.034','0.664','286','8.62','6.72',(18772,'2.09','0.723','0.035','0.665','287','8.63','6.73','2020-08-31 15:10:00',(18773,'2.10','0.724','0.036','0.666','288','8.64','6.74','2020-08-31 15:20:00',(18774,'2.11','0.037','0.667','289','8.65','6.75','2020-08-31 15:30:00',(18775,'1.05','0.131','0.205','104','6.63','5.51',(18776,'1.06','0.658','0.132','0.206','105','6.64','5.52',(18777,'1.07','0.133','0.207','106','5.53',(18778,'1.08','0.134','0.208','107','5.54',(18779,'1.09','0.135','0.209','108','5.55',(18780,'1.10','0.136','0.210','109','5.56',(18781,'1.11','0.137','0.211','110','5.57',(18782,'1.12','0.138','0.212','111','5.58',(18783,'00209705','05','3.17','1.383','0.169','0.873','15.29','394','12.27','Solar'),(18784,'3.19','1.385','0.171','0.875','15.31','396','12.29',(18785,'3.21','1.387','0.173','0.877','15.33','398','12.31',(18786,'3.23','1.388','0.175','0.879','15.35','400','12.33',(18787,'388',(18788,'392','2020-08-31 15:40:00',(18789,'2020-08-31 15:50:00',(18790,'2020-08-31 16:00:00',(18791,'2.13','291',(18792,'2.15','293',(18793,'2.17','295',(18794,'2.19','297',(18795,'1.14','113',(18796,'1.16','115',(18797,'1.18','117',(18798,'1.20','119','Sync Meter');

我要执行以下操作

根据日期和时间取出特定来源的所有同步表,持续24小时。也就是说,如果从turned on2020-08-31 14:00:00的来源是2020-08-31 15:00:00,那么我想检查一下在这段时间内有多少个同步仪表数据可用。例如

msn     | cust_id   | MAX(kwh_t)| data_date_time(start) | data_date_time(end) | source
============================================================================================
00209703|           | 300       | 2020-08-31 14:00:00   | 2020-08-31 14:30:00 | WAPDA
00209706|37010114713| 200       | 2020-08-31 14:00:00   | 2020-08-31 14:30:00 | Sync Meter
00209707|37010114710| 100       | 2020-08-31 14:00:00   | 2020-08-31 14:30:00 | Sync Meter
00209703|           | 310       | 2020-08-31 14:30:00   | 2020-08-31 15:00:00 | WAPDA
00209706|37010114713| 250       | 2020-08-31 14:30:00   | 2020-08-31 15:00:00 | Sync Meter
00209707|37010114710| 150       | 2020-08-31 14:30:00   | 2020-08-31 15:00:00 | Sync Meter
....

以上输出表仅供参考。输出可能会更改

执行上述操作的原因是,我想检查当特定来源为turned on时,哪个同步仪表正在提供数据。

目前,我已经在fiddle

中设置了一个查询

注意:由于一次将一个turned on作为一个来源,因此一个特定来源将有多个日期时间。例如,如果某个源在turned on12:00:00 PM之间为13:00:00,则它将在其他时间再次为turned on,例如在18:00:0020:00:00之间反之亦然。每个数据的持续时间为 10分钟,即每10分钟从电表中提取数据。

更新1

我为源WAPDA添加了更多数据,并尝试运行以下查询

SELECT d.`msn`,d.`cust_id`,MAX(d.`kwh_t`),MIN(d.`data_date_time`),MAX(d.`data_date_time`),d.`s_type`
FROM `mdc_meters_data` d
WHERE d.`data_date_time`>='2020-08-31 00:00:00' AND  d.`data_date_time`<='2020-08-31 23:59:59'
GROUP BY d.`s_type`

以下是结果

enter image description here

输出不是我想要的

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)