Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyliczanie liczby dni na podstawie daty ?
Forum PHP.pl > Forum > Przedszkole
plejaz
Witam, czy jest możliwość wyliczenia przy pomocy php liczby dni na podstawie daty, która jest zwracana z bazy danych ?

Mam 3 kolumny:
W dwóch pierwszych $od i $do wpisuję ręcznie daty w formacie DD-MM-RRRR
Trzecią kolumnę $wynik chcę zrobić wynikiem w formie liczby dni $od - $do = $wynik
  1. <?php
  2. $sql = "SELECT * FROM work where 1";
  3. if( isset($_GET['char']) ){
  4. $sql .= " and LEFT(rodzaj,20)='".$_GET['char']."' ";
  5. }
  6. $sql .=" ORDER BY id DESC";
  7. $result = mysqli_query($mysqli,$sql);
  8. $sno = 1;
  9. while($fetch = mysqli_fetch_array($result)){
  10. $id = $fetch['id'];
  11. $rodzaj=$fetch['rodzaj'];
  12. $od=$fetch['od'];
  13. $do=$fetch['do'];
  14. ?>
  15.  
  16. <td align="center"><?php echo $sno; ?></td>
  17. <td align="center"><?php echo $rodzaj; ?></td>
  18. <td align="center"><?php echo $od; ?></td>
  19. <td align="center"><?php echo $do; ?></td>
  20. <td align="center">TUTAJ WYNIK BĘDĄCY RÓŻNICĄ $do - $od</td>
nospor
Pisales mi na PW ze wiesz jak uzywac diff.
Jaki wiec masz problem by wstawic do diff zmienne $od oraz $do?
plejaz
Problem mam taki, że nie potrafię tego zaimplementować, próbowałem różnych wariantów pracy z funkcją diff,.
Wiem jak odjąć daty wpisane ręcznie, ale nie wiem jak odjąć daty, które są wyświetlane z bazy danych.
Przykład jaki chcę zastosować to:
  1. $d1 = new DateTime("09.08.2017");
  2. $d2 = new DateTime("11.08.2017");
  3. echo $d1->diff($d2)->days;

Wynik mam zwracany jako 2, a powinno być 3.
trueblue
I wynik jest prawidłowy.
Od północy 9-tego do północy 10-tego, to 1 dzień. Od północy 10-tego do północy 11-tego, to kolejny dzień.
Razem 2 dni.
nospor
Cool, a ja sie poraz kolejny pytam jaki masz problem by wstawic tam zmienne?

  1. $d1 = new DateTime($od);
  2. $d2 = new DateTime($do);
plejaz
Matematyczny wynik jest ok, a jak uwzględnić 11.08 jako włącznie ? Wtedy mam 09, 10, 11 - czyli 3 dni.
trueblue
A jak z dwójki robisz trójkę?
plejaz
Cytat(nospor @ 11.08.2017, 16:08:15 ) *
Cool, a ja sie poraz kolejny pytam jaki masz problem by wstawic tam zmienne?

  1. $d1 = new DateTime($od);
  2. $d2 = new DateTime($do);

Robiłem tak i wynik zwracany mam jako "0".
W tabeli bazy danych ustawiałem typ jako DATE i VARCHAR i nie mogę uzyskać wyniku.
  1. <?php
  2. $sql = "SELECT * FROM work where 1";
  3. if( isset($_GET['char']) ){
  4. $sql .= " and LEFT(rodzaj,20)='".$_GET['char']."' ";
  5. }
  6. $sql .=" ORDER BY id DESC";
  7. $result = mysqli_query($mysqli,$sql);
  8. $sno = 1;
  9. while($fetch = mysqli_fetch_array($result)){
  10. $id = $fetch['id'];
  11. $rodzaj=$fetch['rodzaj'];
  12. $od=$fetch['od'];
  13. $do=$fetch['do'];
  14. $d1 = new DateTime($od);
  15. $d2 = new DateTime($do)
  16. ?>
  17.  
  18. <td align="center"><?php echo $sno; ?></td>
  19. <td align="center"><?php echo $rodzaj; ?></td>
  20. <td align="center"><?php echo $od; ?></td>
  21. <td align="center"><?php echo $do; ?></td>
  22. <td align="center"><?php echo $d1->diff($d2)->days;?></td>


Cytat(trueblue @ 11.08.2017, 16:11:16 ) *
A jak z dwójki robisz trójkę?

Nie bardzo rozumiem Twoje pytanie.
nospor
To pokaz co zawiersa $od.
Moze masz zly format.

var_dump($od);
var_dump($do);


Co do zrobienia z 2 3 naprawde nie wiesz ze trzeba zrobic:
2 + 1 = 3
?
viking
Trzeba też pamiętać że ma być poprawna strefa czasowa ustawiona.
plejaz
Cytat(nospor @ 11.08.2017, 16:40:47 ) *
To pokaz co zawiersa $od.
Moze masz zly format.

var_dump($od);
var_dump($do);

string(10) "08.08.2017" string(10) "11.08.2017" - te wartości są wpisane ręcznie w bazie danych.
Cytat
Co do zrobienia z 2 3 naprawde nie wiesz ze trzeba zrobic:
2 + 1 = 3
?

przemilcze...

Ok działa, problemem był zły ciąg znaków w bazie danych.
Puszy
Dodanie 1 do wyniku nie rozwiąże problemu. W przypadku gdy autor tematu będzie chciał wyliczyć róźnicę między 1.01 12:30 a 1.01 14:30 zwróci sobie 1 dzień. Problem leży w definicji słowa dzień. Skrypt który który zwracał 2 zwracał informację o dobach które minęły, idąc dalej można pokusić się o reguły definiujące kiedy zaczyna się nasz "dzień" (np jeżeli będzie to wykorzystywane jako dni pracy). Moim zdaniem samo dorzucenie +1 może być w mylące.
nospor
Ale w tym przypadki mowimy o tych samych godzinach (a przynajmniej tak wynika z kodu) wiec nie bedzie problemu o ktorym wspomniales
Puszy
Jeżeli pominiemy godziny to i tak wg mnie różnica między datami równa 2 jest poprawną odpowiedzią jednak z różnych przyczyn autor tematu chce mieć 3, pytanie czy dla różnicy 1.01 a 1.01 chce otrzymać 0 czy jednak 1?
trueblue
Autor dał odpowiedź w poście numer 6.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.