У меня есть таблица со следующей настройкой:

CREATE TABLE IF NOT EXISTS `appointment` (
  `appId` tinyint(3) UNSIGNED AUTO_INCREMENT NOT NULL,
  `startDateTime` datetime,
  `duration` time DEFAULT NULL
);

Пример данных:

appId   startDateTime         duration
1       2015-05-04 16:15:00   00:14:00
2       2015-05-12 08:15:00   05:54:00
3       2015-05-12 08:35:00   02:14:00
4       2016-05-04 08:11:00   04:11:00
5       2015-05-13 19:30:00   02:50:00

Ожидаемый выход:

appId   startDateTime         duration
2       2015-05-12 08:15:00   05:54:00
3       2015-05-12 08:35:00   02:14:00

Мне нужен запрос, который может проверить каждую запись в таблице и вернуть и совпадающие записи. В приведенном выше примере данных 2 и 3 будут перекрываться. Я могу преобразовать оба поля во время unix и рассчитать время окончания, однако я не уверен, как сравнивать каждую запись

Есть идеи?

1
Enayet Hussain 27 Ноя 2016 в 21:29

2 ответа

Лучший ответ

Используя скрипку Фейсала ...

-- ----------------------------
-- Table structure for appointment
-- ----------------------------
DROP TABLE IF EXISTS `appointment`;
CREATE TABLE `appointment` (
  `appId` tinyint(10) NOT NULL AUTO_INCREMENT,
  `startDateTime` datetime DEFAULT NULL,
  `duration` time DEFAULT NULL,
  PRIMARY KEY (`appId`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of appointment
-- ----------------------------
INSERT INTO `appointment` VALUES 
('1', '2015-05-04 16:15:00', '00:14:00'),
('2', '2015-05-12 08:15:00', '05:54:00'),
('3', '2015-05-12 08:35:00', '02:14:00'),
('4', '2016-05-04 08:11:00', '04:11:00'),
('5', '2015-05-13 19:30:00', '02:50:00');

SELECT DISTINCT x.* 
           FROM appointment x
           JOIN appointment y
             ON y.startdatetime < x.startdatetime + INTERVAL TIME_TO_SEC(x.duration) SECOND
            AND y.startdatetime + INTERVAL TIME_TO_SEC(y.duration) SECOND > x.startdatetime
            AND y.appid <> x.appid;


    appId startDateTime       duration
        3 12.05.2015 08:35:00 02:14:00
        2 12.05.2015 08:15:00 05:54:00

http://rextester.com/YJA59081

1
Strawberry 27 Ноя 2016 в 22:17

Попробуйте выполнить этот запрос ниже. Надеюсь, это решит вашу проблему.

SELECT
    tbl1.*
FROM
    appointment tbl1,
    appointment tbl2
WHERE
    tbl2.appId <> tbl1.appId
AND tbl2.startDateTime < tbl1.startDateTime + INTERVAL TIME_TO_SEC(tbl1.duration) SECOND
AND tbl2.startDateTime + INTERVAL TIME_TO_SEC(tbl2.duration) SECOND > tbl1.startDateTime;

Нажав на ссылку ниже, вы сможете увидеть желаемый результат в прямом эфире.

SQL Fiddle Demo

0
Faisal 28 Ноя 2016 в 05:29