【发布时间】:2015-08-06 17:28:07
【问题描述】:
我的表结构如下:
表名:avail
id (autoincremetn) | acc_id | start_date | end_date
-------------------------------------------------------
1 | 175 | 2015-05-26 | 2015-05-31 |
-------------------------------------------------------
2 | 175 | 2015-07-01 | 2015-07-07 |
-------------------------------------------------------
它用于定义日期范围的可用性,例如。对于给定的 acc_id,start_date 和 end_date 之间的所有日期都不可用。
根据用户输入,我正在关闭不同的范围,但如果用户尝试关闭(提交)一个范围,该范围的 start 或 end_date 在已经存在的范围内(对于提交 acc_id) 在数据库中。 在此示例中,start_date: 2015-05-30 end_date: 2015-06-04 将是一个很好的失败候选。
我找到了这个 QA: MySQL overlapping dates, none conflicting
这几乎解释了如何分 2 步完成,2 个查询,中间有一些 PHP 逻辑。
但我想知道是否可以在一个插入语句中完成。 我最终会检查受影响的行是否成功或失败(子问题:除了日期重叠之外,是否有更方便的方法来检查它是否因其他原因而失败?)
编辑:
针对 Petr 的评论,我将进一步说明验证:
应避免任何形式的重叠,即使是包含 整个范围或发现自己在现有范围内。另外,如果 开始或结束日期等于现有的开始或结束日期,它必须是 视为重叠。有时某些 acc_id 已经有更多 表中响铃不止一个,因此应针对 具有给定 acc_id 的所有条目。
【问题讨论】:
-
作为一个附带问题,如果用户的范围与现有范围之一完全重叠,您没有指定您需要做什么?在您的示例中,范围 (2015-05-20, 2015-06-10) 是否应该失败?它重叠,但“它的开始或结束日期在已经存在的范围内的某个地方”的要求不成立。
-
@Petr 感谢您的快速回复,应避免任何形式的重叠,即使是包含整个范围或发现自己在现有范围内的重叠。此外,如果开始或结束日期等于现有的开始或结束日期,则必须将其视为重叠。有时某些 acc_id 在表中已经有多个响铃,因此应针对具有给定 acc_id 的所有条目进行验证。
-
那么您最好编辑您的问题以使其清楚。而且当你收到任何答案时(我不会回答,因为我对mysql不太了解),记得也要对照这个案例检查他们,因为很容易忽略这个案例。
标签: php mysql validation date datetime