2016-11-27 11 views
1

私は次のセットアップを持つテーブルがあります。私は、クエリを必要とするMySQLの選択日時の重複エントリー

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

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 

予想される出力をテーブル内のすべてのエントリをチェックして、リターンし、衝突するエントリを確認できます。上記のサンプルデータでは、2と3が重複します。私は両方のフィールドをUNIX時間に変換して終了時刻を計算することができますが、各エントリを比較する方法がわかりません

ご存知ですか?

+0

あなたは、任意のサンプルデータを持っていますか?期待される成果を教えてください。 – Faisal

+0

イベントAは、イベントBが開始された後にイベントAが終了し、イベントBが終了する前に開始される場合、イベント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の日に2つのイベントが発生しただけなので、重複しているとは限りません – Strawberry