2

ユーザーが指定した特定の範囲内にあるデータベース テーブルに格納されているカレンダーのすべてのイベントを取得しようとしています。イベントが複数日にまたがるまで機能します。その時点で、終了日は時間範囲内にないため、クエリはそれを破棄します。私の質問は、範囲の前に開始して範囲内で終了するか、範囲内で開始して終了するかに関係なく、指定された範囲内にあるすべてのイベントを取得する方法です。範囲の後に開始する、または範囲の前に終了するすべてのイベントを結果から除外する必要があります

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

現在のクエリ

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
  FROM events t0_ 
  WHERE t0_.start > start
    AND t0_.end < end

サンプルデータ:

name                     start                    end
--------------------     --------------------     --------------------
test event               2012-02-17 09:00:00      2012-02-17 09:50:00
test event2              2012-02-17 09:00:00      2012-02-19 09:00:00
test event3              2012-02-12 09:00:00      2012-02-17 09:00:00
test event4              2012-02-12 09:00:00      2012-02-13 09:00:00

期待される結果データ:

name                     start                    end
--------------------     --------------------     --------------------
test event               2012-02-17 09:00:00      2012-02-17 09:50:00
test event2              2012-02-17 09:00:00      2012-02-19 09:00:00
test event3              2012-02-12 09:00:00      2012-02-17 09:00:00

範囲あり:

2012-02-17 00:00:00 - 2012-02-17 23:59:59

ご覧のとおり、指定された範囲内にあるイベントに加えて、範囲内で開始して後に終了するイベントと、範囲の前に開始して範囲内で終了するイベントを取得します。

4

1 に答える 1

1

最も簡単な方法は、否定によって行うことです。

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
FROM events t0_ 
WHERE 
    NOT(
        t0_.end < '2013-09-05 00:00:00'
        OR t0_.start > '2013-09-06 23:59:59'
    )

このようにして、範囲の前に終了し、範囲の後に開始するすべてのイベントを除外します。

于 2013-09-05T12:10:29.410 に答える