繁体   English   中英

通过时移获取数据-PHP MYSQL

[英]Fetch data by time shifts - PHP MYSQL

我正在基于轮班的应用程序上工作,我的工作人员分三班倒,早上6点至下午2点,下午2点至10点,晚上10点至6点(第二天)。 我需要计算记录在数据库中的每个班次的总工作时间。

  $clientid = $_GET["clientid"];
  $date = $_GET["edate"];
  $shift = $_GET["shift"];

  if(!empty($clientid))
  {
    if($shift=='a')
    {
      $sq =  mysql_query("SELECT * from logusage WHERE etime BETWEEN '6:00:00' AND '14:00:00' AND clientid= '$clientid' AND edate = '$date'",$this->db);
    }
    else if($shift=='b')
    {
      $sq =  mysql_query("SELECT * from logusage WHERE etime BETWEEN '14:00:00' AND '22:00:00' AND clientid= '$clientid' AND edate = '$date'",$this->db);
    }
    else if($shift=='c')
    {
      $sq =  mysql_query("SELECT * from logusage WHERE etime BETWEEN '22:00:00' AND '6:00:00' AND clientid= '$clientid' AND edate= '$date'",$this->db);
    }

每当我尝试访问Shift C时,由于我也正在解析日期,因此它仅在当天的11点59分之前获取我的数据。 我如何更改sql以第二天获取数据,直到凌晨6点?

对于第三个,您需要减去几个小时才能使日期正确:

SELECT * 
FROM logusage
WHERE etime BETWEEN '22:00:00' AND '6:00:00' AND
      clientid= '$clientid' AND
      date(date_sub(edate, interval 6 hour)) = '$date';

我强烈建议您将EDATE和ETIME作为TIMESTAMP值而不是2个单独的列存储在单个列中。 将时间戳记存储为GMT + 00值而不是本地时间也是一种好习惯-但这仅在本地时间使用DST(夏令时)时才重要。 尝试以下代码:

$clientid = (int)$_GET["clientid"];
$date = $_GET["edate"];
$shift = $_GET["shift"];

if($clientid != 0 AND $date != '')
{
    // I suppose $date is in format YYYY-MM-DD
    list($year,$month,$day) = preg_split('/-/',$date);
    switch($shift)
    {
        case 'a':
            $beg_stamp = mktime(6,0,0,$month,$day,$year);
            $end_stamp = $beg_stamp + 8*3600 - 1;
            break;
        case 'b':
            $beg_stamp = mktime(14,0,0,$month,$day,$year);
            $end_stamp = $beg_stamp + 8*3600 - 1;
            break;
        case 'c':
            $beg_stamp = mktime(22,0,0,$month,$day,$year);
            $end_stamp = $beg_stamp + 8*3600 - 1;
            break;
    }
    if($beg_stamp != '' AND $end_stamp != '') // not strictly needed, if $shift is always valid
        $sq = mysql_query('SELECT * from logusage WHERE clientid = '.$clientid.' AND TIMESTAMP(edate,etime) BETWEEN "'.date('Y-m-d H:i:s',$beg_stamp).'" AND "'.date('Y-m-d H:i:s',$end_stamp).'" ORDER BY edate,etime',$this->db);
}

您从$ end_stamp中减去1,因为SQL谓词BETWEEN是包含在内的-即x BETWEEN y AND z等于x> = y AND x <= z,并且您不想捕获属于下一个班次的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM