我在mysql server 8.0中有以下名为reserve的表:
$path = iconv( 'UTF-8', 'ISO-8859-1', utf8_encode($thisRow['path']) ) ;
客户将填写表格以指定他想要的日期(start_res_date和finish_res_date),因此我必须进行查询以检查此时间段是否可用。
我被困在这里,主要是因为这个特定产品可以有多个预订。
所以,像这样:
RESERVES (
res_id INT NOT NULL AUTO INCREMENT,
product_id INT NOT NULL,
start_date DATE NOT NULL,
finish_date DATE NOT NULL,
PRIMARY KEY(res_id),
FOREIGN KEY(product_id) REFERENCES PRODUCT(product_id) ON UPDATE CASCADE ON DELETE RESTRICT
);
将无法正常工作,因为如果可以使用其中一个保留的日期,它将返回product_id。
我想要的是拒绝其product_id,如果它至少可用于表中的一个保留。
如何处理它的任何想法?感谢。
答案 0 :(得分:1)
如果预订窗口的任何部分与您的窗口重叠,则会在时间窗口期间保留产品。这是最容易以图形形式看到的:
即。绿色栏表示与您的预订窗口冲突的其他预订/红色栏是完全在您窗外的预订,因此不会发生冲突。
与此图相关的是a blog post更详细的内容:。
您应该使用如下所示的SQL来检查产品是否在给定时间段内可用:
select top 1 1 ProductIsNotAvailable
from Reserves
where product_id = @productToBeReserved
and start_res_date < @newReservationFinishDate
and finish_res_date => @newReservationStartDate
即。如果您未收到上述查询的回复1
,则仅允许预订。