2016-11-27 1 views
1

MySQL을 선택 날짜 시간 중복 항목 :나는 다음과 같은 설정이있는 테이블이

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 

예상 출력 : I는 질의를 필요로

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이 겹칩니다. 두 필드를 유닉스 시간으로 변환하고 종료 시간을 계산할 수 있지만 각 엔트리를 비교하는 방법을 모르겠다.

어떤 생각?

+0

당신이 어떤 샘플 데이터가 있습니까? 또한 예상 결과를 알려주십시오. – Faisal

+0

이벤트 A는 이벤트 B가 시작된 후에 이벤트 A가 끝나고 이벤트 B가 끝나기 전에 시작되면 이벤트 B와 중첩됩니다. – Strawberry

+0

@Faisal Done, thanks –

답변

1

파이의 바이올린을 사용하여 ...

-- ---------------------------- 
-- 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

+0

"y.appid <> x.appid;"가 무엇인가요? 하기? –

+0

겹치는 이벤트는 무시됩니다. – Strawberry

0

아래의 쿼리를 사용해보십시오. 그것이 당신의 문제를 해결해야한다 바랍니다.

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

나는 어떻게 든 그것을 의심한다 – Strawberry

+0

@ 스트로 베리 왜 의심 스럽습니까? 설명 할 수 있니? – Faisal

+0

psame 하루에 두 개의 이벤트가 발생하기 때문에 중복되지는 않습니다. – Strawberry

관련 문제