ニックと同様に、between
は必要なものです。この場合、exists
またはnot exists
と組み合わせて、スケジュールの競合を避けることができます。 insert
は、新しい部屋(競合を示す)と新しい部屋の間の開始時刻または終了時刻が同じ日に、同じ部屋のスケジュールにエントリがない場合にのみ実行します。この例では
ルック:
SQL Fiddle
MS SQL Server 2008のスキーマのセットアップ:
CREATE TABLE schedule
([room] int, [date] date, [start] time, [finish] time)
;
INSERT INTO schedule
([room], [date], [start], [finish])
SELECT 202, '2017-02-26', '16:00', '17:00'
WHERE NOT EXISTS (SELECT *
FROM schedule
WHERE room = '202' AND date = '2017-02-26' AND
(start BETWEEN '16:00' AND '17:00'
OR finish BETWEEN '16:00' AND '17:00'))
;
INSERT INTO schedule
([room], [date], [start], [finish])
SELECT 202, '2017-02-26', '15:50', '17:10'
WHERE NOT EXISTS (SELECT *
FROM schedule
WHERE room = '202' AND date = '2017-02-26' AND
(start BETWEEN '15:50' AND '17:10'
OR finish BETWEEN '15:50' AND '17:10'))
;
INSERT INTO schedule
([room], [date], [start], [finish])
SELECT 202, '2017-02-26', '15:00', '15:59'
WHERE NOT EXISTS (SELECT *
FROM schedule
WHERE room = '202' AND date = '2017-02-26' AND
(start BETWEEN '15:00' AND '15:59'
OR finish BETWEEN '15:00' AND '15:59'))
;
クエリ1:
SELECT *
FROM schedule
Results:
アプリケーションで
| room | date | start | finish |
|------|------------|------------------|------------------|
| 202 | 2017-02-26 | 16:00:00.0000000 | 17:00:00.0000000 |
| 202 | 2017-02-26 | 15:00:00.0000000 | 15:59:00.0000000 |
、それは次のようになります
疑似:_will_作業の間
SELECT count(*)
FROM schedule
WHERE room = '202' AND date = '2017-02-26' AND
(start BETWEEN '15:00' AND '15:59'
OR finish BETWEEN '15:00' AND '15:59')
if count(*) = 0 then
INSERT INTO schedule
([room], [date], [start], [finish])
SELECT 202, '2017-02-26', '15:00', '15:59'
else
ERROR "CONFLICT WITH ANOTHER SCHEDULE"
end if
それはちょうどあなたがチェックしているかに依存します。 4:00〜3:50と5:10。正しいデータ型を使用していることを確認してください。コード固有の質問がある場合は、試したコードと使用しているデータベースの種類(MySQLまたはSQL Serverなど)を投稿してください。 –