Php 就业历史上的差距

Php 就业历史上的差距,php,mysql,Php,Mysql,我有一个简单的就业历史数据库,我存储条目id、用户id、他们的工作、开始和结束日期。可能存在一些重叠条目。我需要确定在给定的时间段内,给定的时间段内没有中断 因此,用户_id 1的工作历史如下 Marketing - 01/01/2013 to 19/05/2013 Sales - 01/01/2011 to 01/05/2012 Admin - 01/01/2010 to 31/12/2010 实际上,我将日期存储为unix时间戳。在三年的历史记录中,用户_id 1在其销售工作和营销工作之间

我有一个简单的就业历史数据库,我存储条目id、用户id、他们的工作、开始和结束日期。可能存在一些重叠条目。我需要确定在给定的时间段内,给定的时间段内没有中断

因此,用户_id 1的工作历史如下

Marketing - 01/01/2013 to 19/05/2013
Sales - 01/01/2011 to 01/05/2012
Admin - 01/01/2010 to 31/12/2010

实际上,我将日期存储为unix时间戳。在三年的历史记录中,用户_id 1在其销售工作和营销工作之间有超过6个月的休息时间。我如何向他们标记此项,以便他们可以提供此期间的条目。

您将查找以下内容:

<?php
    $time_allowed = '1 month';

    $person = [
        [
            1305819929, // 19-05-11
            1337442341  // 19-05-12
        ],

        [
            1337442341, // 19-05-12
            1345933614  // 26-08-12
        ],

            // almost 4 month gap here - this will result in flagged() getting triggered

        [
            1355935614, // 19-12-12
            1368978787  // 19-05-13
        ]
    ];

    $time_allowed = strtotime('now') - strtotime("-{$time_allowed}");

    foreach($person as $key => $job)
    {
        if( ! isset($person[$key + 1]))
        {
            if($job[1] !== 'current' && (strtotime('now') - $job[1]) > $time_allowed)
            {
                flagged();
            }
        }
        else
        {
            if(($person[$key + 1][0] - $job[1]) > $time_allowed)
            {
                flagged();
            }
        }
    }

    function flagged()
    {
        // user flagged
    }

显然$person将从数据库中抓取。脚本应该是不言自明的,

这个问题比看起来更难,因为你可能在就业历史中有重叠。事实上,你可以把一段时间的工作完全放在另一段时间内,也可以在另一端重叠

你要找的是一个与开始日期有间隔的结束日期,并且不在另一个雇佣期。因此,让我们使用相关子查询来获取结束日期之后的下一个开始日期,如中所示:

     select t.*,
             (select StartDate
              from t t2
              where t2.user_id = t.user_id and
                    t2.StartDate > t.EndDate
              order by StartDate desc
              limit 1
             ) nextStartDate
      from t
现在的问题是:这段时间是否被另一段时间所覆盖。为此,我将使用一个复杂的where子句:

根据您处理重叠的方式,您可能希望在日期之间留出几天的延迟时间

这将返回表中存在间隙的所有记录。在您的示例数据中,这将返回今天的记录2013-05-19。销售记录在销售职位之前有一个缺口。市场营销将在未来回归,因为它将在过去结束

实际上,一个间隙可能导致返回多个记录。当存在重叠时,就会发生这种情况,我将用数字来解释:0、10、5、12、15、20。从12/13开始的间隔将影响两个记录。如果这是一个问题,那么查询是可以修复的,尽管我第一次想到如何修复它会使查询更加复杂


大概,您还将对用户ID进行过滤,您可以将其放在最外层的where子句中。

我认为Dave只要求在用户下班6个月后对其进行标记。我会在一秒钟内更新我的帖子。我想应该是99%到100%的mysql。你是100%的phpIt工程,虽然。我从来没有真正考虑过在@drewpierce上使用100%的MySQL这是一个典型的例子,完全应该由数据库引擎来完成,但是程序员想要用非常慢的php代码循环。哎呀。如果有7000万行呢?用PHP解决问题没有错。没有人会认真解决这样的问题?认真地PHP比MySQL简单得多。你为什么要一次完成7000万行?例如,为什么不在登录时询问用户,这样您就不会让MySQL脚本运行数小时,而只需要不到一毫秒的时间@DrewPierceAm我想通过第二个代码抛出的SQL中的错误来假设这是“标志”?@Dave。不,这应该是返回表中的所有记录,这些记录之后会出现间隙。代码有t2.nextStartDate,应该是t2.StartDate。我还添加了一个复选框来过滤当前处于活动状态的记录。酷,所以零行结果会标记错误,我可以将我的用户发送回以填写他们的详细信息?
select t.*
from (select t.*,
             (select StartDate
              from t t2
              where t2.user_id = t.user_id and
                    t2.StartDate > t.EndDate
              order by StartDate desc
              limit 1
             ) nextStartDate
      from t
     ) t
where not exists (select 1
                  from t t2
                  where t2.StartDate <= t.EndDate and
                        t2.EndDate >= t.nextStartDate
                 ) and
      (t.EndDate is null or t.EndDate > now())