我正在为我们的网站编写广告预订系统。我们使用StartDate
和EndDate
字段预订了广告,以表明他们在线的时长。
添加新广告时,我会进行快速验证检查,以确保新广告不会与预订到同一位置的现有广告冲突。
我以为我有这个问题:
SELECT *
FROM adverts
WHERE EndDate >= '2010-04-22'
AND StartDate < '2010-04-22'
2010-4-22是我要预订的新广告的StartDate
。已预订的广告的StartDate
为2010-04-26,EndDate
为2010-05-09。
这些是具有不同日期的查询结果:
尝试在现有广告结束后预订广告:返回0行(正确)
尝试预订在现有广告的日期范围内开始和结束的广告:返回1行(正确)
尝试在现有广告开始之前预订广告开始和结束:返回0行 (正确的)
尝试在现有广告开始之前预订广告,并在现有广告的日期范围内持续广告:返回0行(不正确)
尝试预订广告,然后在当前广告结束后结束:返回0行(不正确!)
有没有人有任何想法如何重写这个查询,所以我可以确保它只在日期范围内发现冲突?
谢谢, 马特
答案 0 :(得分:6)
SELECT *
FROM adverts
WHERE `EndDate` >= :AdStartDate
AND `StartDate` <= :AdEndDate
我没有考虑开始日期和结束日期相等的边缘情况,因为我不知道你的规则是什么。