php - 工作时间跨越午夜

标签 php mysql

我有一张表格,其中包含员工的工作计划,如下所示:

| column      | type                |
| id          | {int}               |
| day_of_week | (int 1{Mon}-7{Sun}) | 
| from_time   | {time H:i:s}        | 
| to_time     | {time H:i:s}        |
| nd          | {enum 0,1}          |

我需要进行一次搜索,以返回当前时间的工作人员,当时间范围从 00:00 到 23:59 时一切都很好,但我的问题是当一个人选择时 - 星期一从 23:00 到 04:00 - 跨日,我如何存储这些字段以便我可以从 mysql 查询它?

我用 php hack 解决了这个问题,对于对此感兴趣的人来说是解决方案:

    for ($i=0;$i<=1000000;$i++){
        $to_h = rand(0,23);
        if($to_h<10) $to_h = '0'.$to_h;
        $to_m = rand(0,59);
        if($to_m<10) $to_m = '0'.$to_m;
        $from_h = rand(0,23);
        if($from_h<10) $from_h = '0'.$from_h;
        $from_m = rand(0,59);
        if($from_m<10) $from_m = '0'.$from_m;
        if($to_h<=$from_h){
            if($to_h<$from_h){
                $next=1;
            }elseif($to_h==$from_h){
                if($to_m<=$from_m){
                    $next=1;
                }else{
                    $next=0;
                }
            }
        }else{
            $next = 0;
        }
        $db->query("insert into test set day_of_week='".rand(1,7)."', from_time='".$from_h.':'.$from_m."', to_time='".$to_h.':'.$to_m."', nd='".$next."'");
    }

和 mysql 查询来搜索现在工作的人员:

SELECT *, date_format(now(), '%H:%i:%s') FROM test where day_of_week=2 and ((from_time<=date_format(now(), '%H:%i:%s') and to_time>=date_format(now(), '%H:%i:%s') and nd=0) OR (to_time<=date_format(now(), '%H:%i:%s') and nd=1)) limit 30;

这个查询有一个非常好的响应时间,我没有注意到基准测试中有任何错误。 注:“nd”表示第二天(工作时间超过当前工作日的午夜)

最佳答案

使用DATETIME作为开始和结束。

因为就这么简单:

SELECT TIMESTAMPDIFF(HOUR, start, end) -- time difference in hours

获取工作人员的时间点:

SELECT * FROM table WHERE NOW() BETWEEN start AND end

获取当前正在工作的人员(假设endNULL值):

SELECT * FROM table WHERE NOW() > start AND end IS NULL

关于php - 工作时间跨越午夜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147900/

相关文章:

php - 如何使确认码在 1 天后过期

php - 如何连接到heroku mysql数据库

php - 搜索 PHP/MySQL 解决方案以获取最新评论

mysql - 在mysql中选择非字母记录

mysql - 流氓外键

php - 如何循环获取过去十二个月开始和结束的 unix 时间?

php - 如何在 php 中从 google 登录后重定向到最后一个链接?

mysql - mysql中的错误和警告有什么区别

php - 使用 PHP 使用 Mysql 数据库中的数据填充文本字段

php - 无法在 WAMP 上运行 PHP 脚本