用戶提交會議室申請 (開始時間、結束時間、會議室名稱),需判斷該時段該會議室是否已被佔用,若衝突則拒絕。
兩個時間段 [s1, e1) 和 [s2, e2) 衝突的充要條件:
s1 < e2 AND s2 < e1
即:新申請開始早於已有結束,**且** 已有開始早於新申請結束。
SELECT COUNT(*)
FROM meeting_record
WHERE room_name = ?
AND start_time < ? -- 已有記錄開始 < 新結束
AND end_time > ?; -- 已有記錄結束 > 新開始
-- 參數順序:room_name, new_end, new_start
-- 若 COUNT > 0 則衝突
public boolean isConflict(String room, Date start, Date end) {
String sql = "SELECT 1 FROM meeting_record WHERE room_name=? AND start_time AND end_time>?";
return jdbcTemplate.queryForObject(sql, Boolean.class, room, end, start);
}
// Controller
if (service.isConflict(room, start, end)) {
return "該時段會議室已被佔用";
}
service.saveApplication(room, start, end, user);