我需要一些逻辑。
我有一个My-SQL表如下
id | program_name | start_date | end_date
1 | program1 | 2014-12-01 | 2014-12-07
现在,如果我想通过PHP插入id为1的新记录,我想检查周期(start_date和end_date之间)重叠或没有。
假设我想用
插入一条新记录id = 1 , program_name = program1 , start_date = 2014-12-06 , end_date = 2014-12-10
由于周期在这里重叠,我想抛出一个警告消息。我需要逻辑。
我想到的是,
Let
start_date in database = old_start_date , end_date in database = old_end_date, the insert record start date = new_start_date , insert record end date = new_end_date
如果old_start_date < new_start_date and old_end_date < new_end_date == fine (period before the entered period)
old_start_date > new_start_date and old_end_date > new_end_date == fine (period after the entered period)
old_start_date < new_start_date and old_end_date > new_end_date == warning (old period is within the new period)
old_start_date > new_start_date and old_end_date < new_end_date == warning (new period is within the old period)
old_start_date = new_start_date == warning
old_end_date = new_end_date == warning
请指导我,如果我错了,或者会有一个更有效的方式来做这个无论是我的sql或PHP。
谢谢。
下面是你应该做的逻辑顺序:(一旦你理解了它,你就可以在任何编程语言中使用它)
1-创建function_a(date d),当日期大于指定日期
时返回true2-创建function_b(date d),当日期小于指定日期
时返回true3-创建一个循环并调用function_a(在所有old_end_dates上调用它)并使其返回true只有当所有结果返回true(保存结果在var_a)
一般来说:只有当新的开始日期大于所有记录的结束日期时,返回true
4-创建一个循环并调用function_b(在所有old_end_dates上调用它),并使它只有在所有结果返回true时才返回true(将结果保存在var_b中)
一般来说:只有当新的结束日期小于所有记录的结束日期时,返回true
5-如果(var_a==true或var_b ==true) ----->那么保存新记录是安全的,因为如果新的开始日期在旧的结束日期之后,或者新的结束日期在旧的开始日期之前,那么它们不能重叠