Php Mysql查询以确定给定的日期时间是否包含在日期时间间隔中
如果给定的日期时间介于开始日期和结束日期之间,我会被这项任务绊倒。 例如,以下是日历数据表:Php Mysql查询以确定给定的日期时间是否包含在日期时间间隔中,php,mysql,datetime,Php,Mysql,Datetime,如果给定的日期时间介于开始日期和结束日期之间,我会被这项任务绊倒。 例如,以下是日历数据表: | id | start | end | 31 | 2017-03-15 05:21:30 | 2017-03-15 06:21:30 | 32 | 2017-03-14 06:25:30 | 2017-03-14 06:25:30 | 33 | 2017-03-14 06:25:45 | 2017-03-14 06:25:45 我必须使用以下开始和结束日期
| id | start | end
| 31 | 2017-03-15 05:21:30 | 2017-03-15 06:21:30
| 32 | 2017-03-14 06:25:30 | 2017-03-14 06:25:30
| 33 | 2017-03-14 06:25:45 | 2017-03-14 06:25:45
我必须使用以下开始和结束日期时间向表中插入新数据:
开始时间:2017-03-15 05:30:30
end:2017-03-15 06:30:30
但在此之前,我必须检查开始日期和结束日期是否存在于表中的任何日期时间间隔中
结果应该是给定的开始和结束日期不会被插入,因为它落在表id 31 datetime间隔之间或包含在表id 31 datetime间隔之间
我应该如何使用查询来做到这一点?我尝试了这种查询:Select*from calendar\u date as c,其中c.start>=start和c.end给你:
Select * from calendar_date as ,c where LEAST(c.end, end) - GREATEST(c.start, start) > 0
如果要检查一个时间范围是否与另一个时间范围重叠,关键是要检查是否有符合以下条件的行:
@end > t1.start
AND
@start < t1.end
这不是插入,而是选择。@TimBiegeleisen:您能解释一下吗?@dotNet,我已经为我的查询手动添加了开始和结束日期时间:select*from calendar\u项为c,其中TIMESTAMPDIFF(第二,最小(c.end,“2017-03-15 06:30:30”)-最大(c.start,“2017-03-15 05:30”)>0代码>但我提示语法中有错误。谢谢你的回答。@dotNET,你是个了不起的人!它起作用了!是的,是的,我会转换它。@G.Curs:很高兴它有帮助。如果使用标准MySQL格式之一,例如'YYYY-MM-DD HH:MM:SS'
,则不需要进行转换。
DELIMITER $$
DROP TRIGGER IF EXISTS calendar_date_bi $$
CREATE TRIGGER calendar_date_bi
BEFORE INSERT ON calendar_date
FOR EACH ROW
BEGIN
IF EXISTS(SELECT * FROM calendar_date cd
WHERE NEW.end > cd.start AND NEW.start < cd.end) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'overlapping date ranges are not allowed';
END IF;
END $$
DELIMITER ;