Méthode MySQL pour calculer la différence dans une colonne entre deux lignes adjacentes : utilisez d'abord [r1.rownum = r2.rownum - 1] pour déterminer si les deux enregistrements sont les lignes précédentes et suivantes puis utilisez le TIMEDIFF ; fonction pour calculer le décalage horaire.
[Recommandations d'apprentissage associées : tutoriel mysql(vidéo)]
Méthode MySQL pour calculer la différence dans une colonne entre deux lignes adjacentes :
Tout d'abord, le blogueur a une table côté serveur pour enregistrer le GPS rapporté par le conducteur. Informations sur les points, la structure du tableau est la suivante :
-- 司机GPS收集表 CREATE TABLE captainad_driver_gps_position ( id BIGINT NOT NULL auto_increment COMMENT '主键', business_id BIGINT DEFAULT NULL COMMENT '业务ID', device_mac VARCHAR (64) DEFAULT NULL COMMENT '设备MAC地址', device_imei VARCHAR (64) DEFAULT NULL COMMENT '设备IMEI', lat_lng VARCHAR (64) DEFAULT NULL COMMENT '纬经度', capture_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '捕获时间', create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (id), KEY `idx_business_id` (`business_id`) USING BTREE ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '司机GPS收集';
Les données enregistrées dans le tableau sont à peu près les suivantes :
Appuyez maintenant sur capture_time pour obtenir la position GPS, et après tri par heure, faites deux enregistrements avant et après Calculez la différence. Afin de calculer la différence entre les deux, nous devons absolument obtenir deux enregistrements, l'un avant l'autre et l'un après l'autre. Ici, nous pouvons intelligemment utiliser une variable pour enregistrer le nombre de lignes dans la ligne actuelle, puis superposer le nombre. nombre de lignes à chaque fois avec la requête en boucle, pour atteindre l'objectif d'enregistrement de ligne, afin que nous puissions savoir quels sont les deux enregistrements l'un après l'autre.
Instruction SQL pour imprimer le numéro de ligne :
SELECT (@rownum := @rownum + 1) AS rownum, tab.business_id, tab.device_mac, tab.capture_time FROM captainad_driver_gps_position tab, (SELECT @rownum := 0) r -- 声明变量 WHERE 1 = 1 AND DATE_FORMAT( tab.capture_time, '%Y-%m-%d' ) = '2019-06-28' ORDER BY tab.capture_time
Sur cette base, nous écrivons le SQL cible. Ici, j'ai légèrement organisé l'instruction en fonction de notre activité réelle. Le script est à peu près le suivant :
SELECT t.business_id, t.device_mac, t.capture_time, t.tdiff FROM ( SELECT r1.business_id, r1.device_mac, r1.capture_time, TIMEDIFF( r2.capture_time, r1.capture_time ) AS 'tdiff' FROM ( SELECT (@rownum := @rownum + 1) AS rownum, tab.business_id, tab.device_mac, tab.capture_time FROM captainad_driver_gps_position tab, (SELECT @rownum := 0) r WHERE 1 = 1 AND DATE_FORMAT( tab.capture_time, '%Y-%m-%d' ) = '2019-06-28' ORDER BY tab.capture_time ) r1 LEFT JOIN ( SELECT (@INDEX := @INDEX + 1) AS rownum, tab.business_id, tab.device_mac, tab.capture_time FROM captainad_driver_gps_position tab, (SELECT @INDEX := 0) r WHERE 1 = 1 AND DATE_FORMAT( tab.capture_time, '%Y-%m-%d' ) = '2019-06-28' ORDER BY tab.capture_time ) r2 ON r1.business_id = r2.business_id AND r1.device_mac = r2.device_mac AND r1.rownum = r2.rownum - 1 ) t WHERE t.tdiff > '00:00:15'
Dans le code ci-dessus, nous utilisons r1.rownum = r2.rownum - 1
pour déterminer si deux enregistrements sont avant et après, puis utilisons la fonction TIMEDIFF
pour calculer le décalage horaire. À ce stade, notre objectif a été atteint. .
Si vous souhaitez en savoir plus sur la programmation, faites attention à la rubrique Formation php !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!