簡體   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