2016-11-27 35 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 

預期輸出:

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時間並計算結束時間,但我不確定如何比較每個條目

任何想法?

+0

你有什麼樣的數據?並告訴我們您的預期產出。 – Faisal

+0

如果事件A在事件B開始後結束,並且在事件B結束之前開始,則可以說事件A與事件B重疊。 – Strawberry

+0

@Faisal完成,謝謝 –

回答

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

@strawberry你爲什麼懷疑?你能解釋一下嗎? – Faisal

+0

僅僅是因爲在psame日發生了兩件事情,並不意味着它們重疊 – Strawberry