我有3列:Day,start_schedule和end_schedule.
Day | start_schedule | end_schedule
-------|-----------------|--------------
Monday | 1:00 | 3:00
Monday | 6:00 | 8:00
Monday | 8:00 | 10:00
我还在学习php.根据数据库中存储的时间,如何过滤输入的开始时间表和结束时间表是否有效?
例如,如果我想增加时间
>开始时间表= 3:00和结束时间表= 7:00
由于是6:00-8:00,因此您不可以添加此时间表.
>开始时间表= 7:00和结束时间表= 11:00
由于存在6:00-8:00和8:00-10:00,因此您不可以添加此时间表.
解决方法:
我会在mysql中执行大多数逻辑,因为它可以非常简单,直接地处理这类表达式.
在PHP中,在插入新条目之前,我们需要检查1件事:
> end_time是否小于start_time?如果是这样,请中止.
在MySQL中,尝试插入新条目时,我们需要检查4件事:
> start_time是否在任何现有条目中?如果是这样,请中止.
> end_time是否在任何现有条目中?如果是这样,请中止.
>在我们的新条目中是否有任何开始的条目?如果是这样,请中止.
>在我们的新条目中是否有任何条目结尾?如果是这样,请中止.
上面的内容实际上可以重构为一个步骤:
>我们的开始时间是否少于任何条目的结束时间,并且我们的结束时间是否大于整个开始时间?如果是这样,请中止.
mysql> describe sample;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| start | time | YES | | NULL | |
| end | time | YES | | NULL | |
| day | varchar(50) | YES | | Monday | |
+-------+-------------+------+-----+---------+-------+
mysql> SELECT * FROM sample;
+--------+----------+----------+
| day | start | end |
+--------+----------+----------+
| Monday | 01:00:00 | 03:00:00 |
| Monday | 06:00:00 | 08:00:00 |
| Monday | 08:00:00 | 11:00:00 |
+--------+----------+----------+
PHP查询数据库的示例实现:
支持@ regilero,以发布需要的子句的重构版本.
$new_entries = array (
array('Monday', '00:00:00', '23:59:00'),
array('Monday', '12:00:00', '15:00:00'),
array('Monday', '07:00:00', '10:00:00')
);
foreach ($new_entries as $new) {
list ($day, $start, $end) = $new;
$q_day = "'$day'";
$q_end = "'$end'";
$q_start = "'$start'";
$sql = <<
INSERT INTO `sample` (day,start,end)
SELECT $q_day, $q_start, $q_end FROM DUAL
WHERE NOT EXISTS (
SELECT * FROM `sample`
WHERE day = $q_day AND (
$q_start < end AND $q_end > start
)
)
EOQ;
mysql_query ($sql) or die (mysql_error ());
if (mysql_affected_rows () == 0)
print join (' ', $new) . " was not inserted!\n";
else
print join (' ', $new) . " was inserted!\n";
}
这将输出:
Monday 00:00:00 23:59:00 was not inserted!
Monday 12:00:00 15:00:00 was inserted!
Monday 07:00:00 10:00:00 was not inserted!
标签:filter,mysql,php,time,filtering
来源: https://codeday.me/bug/20191101/1987165.html