在实现一个预约功能的时候遇到的一个时间问题,如用户预约了每天的17:00-18:00,一共预约了30两天,那么用户预约的总时长是30个小时,那么这30天的17:00-18:00都不能被其他用户预约了,如16:00-18:00这样的是能预约的,这种是按小时约的,还有一种就是按天预约,如2021:09-01-2021-09-25,如果有用户把1-25号的按整天预约了,那么按小时预约的在2021:09-01-2021-09-25时间段都不能被预约.
这里我用的是存储过程去处理(里面的传值和条件判断字段改成自己的逻辑)
看代码(myslq储存过程):
DELIMITER $$
USE `miaodida`$$
DROP PROCEDURE IF EXISTS `study_reserve_date_check`$$
CREATE DEFINER=`miaodida`@`%` PROCEDURE `study_reserve_date_check`(IN bTime VARCHAR(50),IN eTIme VARCHAR(50),IN studygroupid INT(10))
BEGIN
SET @bTime=bTime;
SET @eTIme=eTIme;
SET @studygroupid=studygroupid;
SELECT id,study_id,study_group_id,seat_num,`type`,date_start,date_end FROM m_study_order WHERE study_id=@studygroupid AND is_pay=1 AND
((@bTime>=date_start AND @bTime<date_end) OR(@bTime<date_end AND @eTIme>date_end) OR(@bTime<=date_start AND @eTIme>date_start));
END$$
DELIMITER ;
使用:mysql执行 CALL study_reserve_date_check('2021-08-18 09:00','2021-08-20 11:00',12)
例子:
DELIMITER $$
USE `miaodida`$$
DROP PROCEDURE IF EXISTS `study_reserve_time_check`$$
CREATE DEFINER=`miaodida`@`%` PROCEDURE `study_reserve_time_check`(IN bTime VARCHAR(50),IN eTIme VARCHAR(50),IN studygroupid INT(10),IN seat INT(10))
BEGIN
SET @bTime=bTime;
SET @eTIme=eTIme;
SET @studygroupid=studygroupid;
SET @seat=seat;
SELECT id,study_id,study_group_id,seat_num,`type`,date_start,date_end FROM m_study_order WHERE study_id=@studygroupid AND seat_num=@seat AND is_pay=1 AND
((@bTime>=date_start AND @bTime<date_end) OR(@bTime<date_end AND @eTIme>date_end) OR(@bTime<=date_start AND @eTIme>date_start));
END$$
DELIMITER ;