Błąd w odejmowaniu liczby sekund

0

Mam taki problem a mianowicie odejmuje liczbę sekund i zapisuje do wyniku i wynik w przypadku kiedy rekordy dzieli jeden dzień jest 86400, ale kiedy dzieli więcej niż 1 dzień to wynik najczęściej to 2 dni nawet jak różnica to 6 dni no czasami jest dobra wartość daje kod źródłowy.

  
   private function oblicz_srednia_dla_jednego_produktu() {
   
   //$this->oblicz_srednia_substancji();
   $wspolne = new \App\Http\Controllers\wspolne();
    $id_produkt = DB::select("select id_produktu from spozycie where id = " . Input::get('id') . "");
    foreach ($id_produkt as $id_produkt2) {}
    $produkt = DB::select("select nazwa,ile_procent,id from produkty where id = '" . $id_produkt2->id_produktu ."'");
    foreach ($produkt as $produkt2) {}
 
    $daty_produktow = "select sum(porcja) as porcja,year(data) as data1,month(data) as data2,day(data) as data3,id_produktu,cena from spozycie where  id_produktu ='" .  $id_produkt2->id_produktu  ."' and data < '2018-03-30' ";
    $i = 0;
    $j = 0;
    $z = 0;
    $data1 = array();

    $suma2 = 0;
    $bool = false;
    if (Input::get("godzina_a") != "") $daty_produktow .= " and  hour(data) >= " . Input::get("godzina_a") ."";
    if (Input::get("godzina_b") != "") $daty_produktow .= " and hour(data) <= " . Input::get("godzina_b") ."";
    $daty_produktow .= " group by data1,data2,data3 ";
    $daty_produktow = DB::select($daty_produktow);
    $ile = count($daty_produktow);
    $liczba_dni = 0;
    foreach ($daty_produktow as $data_produktow2) {
    
      $tablica[$i][0] = $data_produktow2->data1;
      $tablica[$i][1] = $data_produktow2->data2;
      $tablica[$i][2] = $data_produktow2->data3;
      $tablica[$i][3] = $data_produktow2->porcja;

      if ($i > 0 ) {
      $liczba_sekund2 = $wspolne->oblicz_liczbe_sekund($tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2] . " 05:00:00");
      }
      else {
	$liczba_sekund2 =    $wspolne->oblicz_liczbe_sekund($tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2]  . " 05:00:00");
      }
      //$d =  $wspolne->oblicz_liczbe_sekund(1970 . "-" . '01' . "-" .'10'  . " 00:00:00");
      //$c =  $wspolne->oblicz_liczbe_sekund(1970 . "-" . '01' . "-" .'11'  . " 00:00:00");
      //print $c - $d;
      if ($i == 0) {
      }
      print "<br>";
      $liczba_sekund1 = $wspolne->oblicz_liczbe_sekund($tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2] . " 05:00:00");
      $wynik = $liczba_sekund1 - $liczba_sekund2;
      print $wynik;
      print "<br>";
      if ($wynik > 86400) {
	$j++;
	if ($bool == false) {
	$data1[$z][0] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
	$data1[$z][4] = $wynik;
	$bool = true;
	//print $z . "<br>";
	$liczba_dni = round($wynik / 86400);
	print "<br>" . $wynik;
	$suma2 += $data_produktow2->porcja;
	$suma3 = $suma2 / $liczba_dni;
	
	if ($z == 0) {
	  $data1[$z][2] = $suma3;
	}
	else {
	$data1[$z][2] = $suma3;
	}
	$suma2 = 0;
	
	}
	else {
	

	$data1[$z][1] = $tablica[$i-1][0] . "-" . $tablica[$i-1][1] . "-" . $tablica[$i-1][2];
	$bool = false;
	
	}
	
	if ($bool == false) {
	$z++;
	}
	
      }
      
      
      if ($ile-1 == $i ) {
	$data1[$z][1] = $tablica[$i][0] . "-" . $tablica[$i][1] . "-" . $tablica[$i][2];
      }

	
	


      if ($i > 0 and ($tablica[$i][3] != $tablica[$i-1][3] and $wynik > 86400)) {

	//$j = 0;
      }
      $i++;
    
    }
  var_dump($data1);
  }
1

Chciałbym pomóc ale patrzę na pytanie nie wiem o co chodzi nie napisane po polsku bez interpunkcji dzielenie dni na sekundy nie ma podanej funkcji do zmiany na sekundy a sekundy odejmowane i coś nie działa a chciałem pomóc

0

No chodzi o wyciągnięcie tych rekordów gdzie suma poprzednich dni jest większa niż jeden dzień więc w tym wypadku odejmuje liczbę sekund starszego rekordu od aktualnego i mi się sekundy gdzie nie gdzie nie zgadzają.

0
  1. Chyba błędnie zatytułowałeś wątek. Nie masz problemu z odejmowaniem tylko ze znalezieniem rekordów spełniających dany warunek.
  2. Da się to rozwiązać prościej jakbyś już na poziomie zapytania SQL podał warunek który zwróci odpowiednie rekordy.
  3. Próbujesz znaleźć rozwiązanie "pod górę". Nie podałeś jak liczysz "oblicz_liczbe_sekund". W php masz gotowe rzeczy do tego. Skoro daty masz zapisane jako daty to możesz sprawdzić różnicę między nimi za pomocą date_diff. A do zamiany na sekundy też masz getTimestamp - coś chyba z tym kombinowałeś

1 użytkowników online, w tym zalogowanych: 0, gości: 1