Вернуть разницу между двумя выражениями datetime - PullRequest
1 голос
/ 21 июня 2020

В моей таблице MySQL мне нужно проверить, не превышает ли TIMEDIFF () между двумя строками значение три минуты

Если TIMEDIFF () составляет меньше Я обновляю столбцы xDisabled с 1 значением

Это моя таблица

+------+---------------------+---------+-----------+
| xID  | xDate_xHourMinute   | xLines  | xDisabled |
+------+---------------------+---------+-----------+
| 1405 | 2020-06-21 05:24:19 | 3018122 |           |
| 1424 | 2020-06-21 05:22:53 | 3018122 |           |
| 1462 | 2020-06-21 05:22:03 | 3018122 |           |
| 1473 | 2020-06-21 05:18:59 | 3018122 |           |
| 1481 | 2020-06-21 05:18:03 | 3018122 |           |
+------+---------------------+---------+-----------+
5 rows in set

Я безуспешно пробовал это sql запрос, потому что все строки в таблице обновлены

UPDATE `xMinutesSet` a
JOIN `xMinutesSet` b ON a.xLines = B.xLines
AND TIMEDIFF(
    a.xDate_xHourMinute,
    b.xDate_xHourMinute
) < 3
SET a.xDisabled = 1;


+------+---------------------+---------+-----------+
| xID  | xDate_xHourMinute   | xLines  | xDisabled |
+------+---------------------+---------+-----------+
| 1405 | 2020-06-21 05:24:19 | 3018122 |         1 |
| 1424 | 2020-06-21 05:22:53 | 3018122 |         1 |
| 1462 | 2020-06-21 05:22:03 | 3018122 |         1 |
| 1473 | 2020-06-21 05:18:59 | 3018122 |         1 |
| 1481 | 2020-06-21 05:18:03 | 3018122 |         1 |
+------+---------------------+---------+-----------+
5 rows in set

Мне нужен этот результат

+------+---------------------+---------+-----------+
| xID  | xDate_xHourMinute   | xLines  | xDisabled |
+------+---------------------+---------+-----------+
| 1405 | 2020-06-21 05:24:19 | 3018122 |         1 | 00:01:26
| 1424 | 2020-06-21 05:22:53 | 3018122 |         1 | 00:00:50 
| 1462 | 2020-06-21 05:22:03 | 3018122 |           | 00:03:04
| 1473 | 2020-06-21 05:18:59 | 3018122 |         1 | 00:00:56
| 1481 | 2020-06-21 05:18:03 | 3018122 |           |
+------+---------------------+---------+-----------+
5 rows in set

Как решить эту проблему? Пожалуйста, любое предложение

Моя таблица ниже

DROP TABLE IF EXISTS `xminutesset`;
CREATE TABLE `xminutesset` (
  `xID` int(11) NOT NULL AUTO_INCREMENT,
  `xDate_xHourMinute` datetime DEFAULT NULL,
  `xLines` varchar(255) DEFAULT NULL,
  `xDisabled` int(1) DEFAULT NULL,
  PRIMARY KEY (`xID`)
) ENGINE=InnoDB;

-- ----------------------------
-- Records of xminutesset
-- ----------------------------
INSERT INTO `xminutesset` VALUES ('1405', '2020-06-21 05:24:19', '3018122', null);
INSERT INTO `xminutesset` VALUES ('1424', '2020-06-21 05:22:53', '3018122', null);
INSERT INTO `xminutesset` VALUES ('1462', '2020-06-21 05:22:03', '3018122', null);
INSERT INTO `xminutesset` VALUES ('1473', '2020-06-21 05:18:59', '3018122', null);
INSERT INTO `xminutesset` VALUES ('1481', '2020-06-21 05:18:03', '3018122', null);

1 Ответ

1 голос
/ 21 июня 2020

Вы можете использовать оконную функцию LAG() в MySql 8.0 и TIMESTAMPDIFF() вместо TIMEDIFF():

UPDATE `xminutesset` a
INNER JOIN (
  SELECT *,   
    LAG(xDate_xHourMinute) OVER (PARTITION BY xLines ORDER BY xDate_xHourMinute) prev
  FROM `xminutesset`
) b 
ON a.xID = b.xID
AND TIMESTAMPDIFF(MINUTE, b.prev, b.xDate_xHourMinute) < 3
SET a.xDisabled = 1;

См. демонстрацию .

Это будет работать для предыдущих версий:

UPDATE `xminutesset` a
INNER JOIN (
  SELECT x.*,
    (
      SELECT MAX(xDate_xHourMinute)
      FROM `xminutesset`
      WHERE `xLines` = x.`xLines` AND xDate_xHourMinute < x.xDate_xHourMinute 
    ) prev
  FROM `xminutesset` x
) b 
ON a.xID = b.xID
AND TIMESTAMPDIFF(MINUTE, b.prev, b.xDate_xHourMinute) < 3
SET a.xDisabled = 1;

См. demo .

Результаты:

| xID  | xDate_xHourMinute   | xLines  | xDisabled |
| ---- | ------------------- | ------- | --------- |
| 1405 | 2020-06-21 05:24:19 | 3018122 | 1         |
| 1424 | 2020-06-21 05:22:53 | 3018122 | 1         |
| 1462 | 2020-06-21 05:22:03 | 3018122 |           |
| 1473 | 2020-06-21 05:18:59 | 3018122 | 1         |
| 1481 | 2020-06-21 05:18:03 | 3018122 |           |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...