在MySQL中基于时间选择谁在班次中的问题

时间:2013-01-05 21:59:30

标签: php mysql sql

免责声明:仍然是初学者。

我正在制作一个小脚本来显示当前应该轮班的人,按角色过滤。这些转变确实会持续到午夜。截至目前,时间和角色是硬编码的,但我打算允许用户稍后指定(因此为什么我不使用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++;
    }
?>

1 个答案:

答案 0 :(得分:2)

您的括号错误,您的查询最后有OR ('$time' BETWEEN start AND end),因此符合此条件的行将忽略role和days子句。你想要一个额外的配对

((start > end AND ('$time' < end OR '$time' > start)) OR
('$time' BETWEEN start AND end))

一般来说,在数据库中使用逗号分隔值会削弱关系数据库的粒度。如果每个都有单独的行,事情通常会更好。