2016-07-31 7 views
0

Ich arbeite an einer Schicht basierten Anwendung, wo meine Arbeiter in 3 Schichten arbeiten, Morgen 06.00 Uhr bis 14.00 Uhr, 14 Uhr bis 22 Uhr und 22 Uhr bis 06.00 Uhr (nächsten Tag). Ich muss berechnen, um die gesamte Zeit in jeder Schicht gearbeitet, die in der Datenbank protokolliert wird.Daten durch Zeitverschiebungen abrufen - PHP MYSQL

$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); 
    } 

Jedes Mal, wenn ich versuche, die Shift-C zuzugreifen, es holt mich Daten nur bis 23.59 Uhr an diesem Tag, wie ich das Datum auch bin Parsen. Wie ändere ich den SQL-Wert, um Daten für den nächsten Tag bis 6 Uhr morgens zu holen?

Antwort

1

Für die dritte, müssen Sie Stunden subtrahieren, das Datum zu bekommen richtig:

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'; 
+0

Dies löst SQL-Fehler, Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax in der Nähe von '' in Zeile 1 entspricht Ive kopieren eingefügt Ihren Code in der dritten SQL-Zeichenfolge. –

1

empfehle ich Ihnen EDATE und ETIME in einer einzigen Spalte als TIMESTAMP-Wert anstelle von 2 separaten Spalten zu speichern. Es empfiehlt sich auch, Zeitstempel als GMT + 00-Werte anstelle Ihrer Ortszeit zu speichern. Dies ist jedoch nur von Bedeutung, wenn Ihre Ortszeit die Sommerzeit (DST) verwendet. Versuchen Sie, den folgenden Code:

$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); 
} 

Sie subtrahieren 1 vom $ end_stamp, weil die SQL-Prädikat BETWEEN inklusive ist - dh x zwischen y und z entspricht x> = y und x < = z und Sie wollen keine Arbeit aufnehmen, die zur nächsten Schicht gehört.

+0

Wir haben die Migration auf TIMESTAMP implementiert, dies wird jedoch einige Zeit dauern, da das gesamte System für dasselbe geändert werden muss. In der Zwischenzeit hat die SQL, die Sie vorgeschlagen haben, Ymd H: i: s, sollte ich entfernen H: i: s aus dem .date ('Ymd H: i: s', $ beg_stamp) –

+0

Nein, Sie dürfen nicht entfernen das H: i: s - Sie möchten Zeitstempel mit Zeitstempel vergleichen, nicht Zeitstempel mit Datum. Ich nehme an, dass Sie eine Arbeit protokollieren, die nach der Schichtöffnung begonnen und vor der Schichtschließung beendet wurde. Wenn Sie eine Arbeit protokollieren, die mit einer Schicht begonnen wurde, aber so lange ist, dass sie nicht vor der Schicht beendet werden konnte und erst in der nächsten Schicht fertig ist, wird sie wahrscheinlich nur auf die erste Schicht gezählt. –

+0

Dies gibt keine Ausgabe zurück, wenn ich Daten habe, die zu Schicht C in meiner Datenbank gehören. –