免责声明:仍然是初学者。
我正在制作一个小脚本来显示当前应该轮班的人,按角色过滤。这些转变确实会持续到午夜。截至目前,时间和角色是硬编码的,但我打算允许用户稍后指定(因此为什么我不使用NOW()等)。
所以考虑到下面的数据,比如星期一下午4:30,我想知道按时完成的水果,当这个脚本执行时,它将如下所示:
Apple
Banana
但是,当下面的代码执行时,它几乎总是选择整个表。我确信查询本身存在问题,但我为了彻底而将其余部分包括在内。我已经测试过只选择日期和角色本身并且它工作正常,但它选择时间的方式错误地评估为真。我很感激任何建议。
以下是我的表格示例:
+----------+-------------+----------+----------+-------------+
| Name | Days | Start | End | Role |
+----------+-------------+----------+----------+-------------+
| Apple | Sun,Mon,Tue | 15:30:00 | 20:00:00 | Fruit |
| Banana | Mon,Tue,Wed | 16:00:00 | 20:30:00 | Fruit |
| Cheese | Mon,Tue,Wed | 08:30:00 | 10:30:00 | Dairy |
| Carrot | Fri,Sat,Sun | 22:00:00 | 07:00:00 | Vegetable |
+----------+-------------+----------+----------+-------------+
这是我的代码,没有遗漏任何内容:
<?php
date_default_timezone_set('Etc/GMT+6'); // Set default time zone
$time = date("H:i:s"); // Time with seconds in a 24-hour, leading zero format: i.e. 07:00:00 or 15:30:00
$today = date("D"); // Today, in a three-letter format: i.e. Mon, Tue
$role = "Fruit";
$username="example-username";
$password="example-password";
$database="example-database";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT *
FROM work
WHERE `days` LIKE '%$today%' AND
`role` LIKE '%$role%' AND
(start > end AND ('$time' < end OR '$time' > start)) OR
('$time' BETWEEN start AND end)";
$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_close();
$i=0;
while ($i < $num) {
$victim=mysql_result($result,$i,"name");
echo "<li>$victim</li>";
$i++;
}
?>
答案 0 :(得分:2)
您的括号错误,您的查询最后有OR ('$time' BETWEEN start AND end)
,因此符合此条件的行将忽略role和days子句。你想要一个额外的配对
((start > end AND ('$time' < end OR '$time' > start)) OR
('$time' BETWEEN start AND end))
一般来说,在数据库中使用逗号分隔值会削弱关系数据库的粒度。如果每个都有单独的行,事情通常会更好。