Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]odejmowanie godzin
Forum PHP.pl > Forum > Przedszkole
peklo
witam
Mam oto taki kod który dodaje mi w pętli godziny do tabeli czas

  1. foreach((array)$_POST['us'] as $key=>$us) {
  2. $data_wyk = (array)$_POST['data_wyk'][$key];
  3. $godz_powr = (array)$_POST['godz_powr'][$key];
  4. $rozp_pracy = (array)$_POST['rozp_pracy'][$key];
  5.  
  6. $sql ='INSERT INTO czas(rozp_pracy,godz_powr,us) VALUES (:rozp_pracy,godz_powr,us)';
  7. $stmt = $pdo->prepare( $sql );
  8. $stmt->bindValue(':rozp_pracy',$_POST['rozp_pracy'][$key], PDO::PARAM_STR);
  9. $stmt->bindValue(':godz_powr',$_POST['godz_powr'][$key], PDO::PARAM_STR);
  10. $stmt->bindValue(':us', $us, PDO::PARAM_STR);
  11. $stmt->execute();
  12. }

Typ danych w tabeli czas to TIME i jeśli w formularzu mam np godz. 10.00 to do tabeli dodaje mi jako 10:00:00.
Chciałbym teraz dodać jeszcze jedną zmienną np nadgodziny, która odejmie mi dwie zmienne
$nadgodziny=$godz_powr-$rozp_pracy;
  1. [/php]
  2. Próbuje tak
  3. [php]$stmt->bindValue(':nadgodziny',strtotime(($_POST['godz_powr'][$key])) - strtotime(($_POST['rozp_pracy'][$key])), PDO::PARAM_STR);

ale cos mi nie wychodzi. Poza tym chciałbym aby wpis to zmiennej nadgodziny był w takiej postaci 4:00:00 (jeśli np będzie takia różnica 20:00-16:00)
Jak mam to zrobić? Ktoś coś pomoże?

Albo inaczej. Czy da się odjąć te dwie godziny podczas wypełniania formularzza i wrzucenie róznicy do ukrytego inputa?
nospor
strtotime - strtotime da ci liczbe sekund czyli 14400 a nie 04:00 ...
peklo
no bo tak mi daje i dzieliłem to przez 3600 itd itp ale czy ide w dobrum kierunku. Czy tą operacje daje w $stmt->bindValue czy może przed bindowaniem?
nospor
No wartosc ktorą bindujesz ma juz byc prawidlowa... no to chyba logiczne?

A poza tym czemy tych godzin nie trzymasz poprostu w bazie jako sekundy? Byloby o wiele latwiej cokolwiek potem z tym robic.
bobek358
A kolumny jaki mają typ w bazie danych?
peklo
w kolumnach mam TIME. Ok to jak dodam je jako sekundy to jaki najlepiej typ danych zastosować?
nospor
smallint ?
peklo
chyba zza mały zakres bo może byc 24h czyli 86400. MEDIUMINT(5) ?
nospor
No to dostosuj ten INT do max jaki mozesz miec. Zobacz w manualu jaki rozmiar jaki trzyma max i bedziesz wiedzial jaki dobrac.
peklo
nie to sobie dobiore. generalnie chodziło mi o to jaki typ danych dobrać. Czy time czy może jakiś int. I druga sprawa. Jak w formularzu mam np. 16:00 to teraz tą wartość przy dodawaniu do tabeli, mam jak rozumiem pomnożyć X 3600 tak?
nospor
Cytat
Czy time czy może jakiś int.
Jaki typ to przeciez ci podalem wczesniej piszac smallint wiec logiczne ze nie time.

Cytat
Jak w formularzu mam np. 16:00 to teraz tą wartość przy dodawaniu do tabeli, mam jak rozumiem pomnożyć X 3600 tak?
No jesli w formularz nadal wspiujesz 16:00 to tak, przy zalozeniu ze nie bedzie minut smile.gif
peklo
no właśnie ,a jak będzie 16:47 ? smile.gif Co wtedy
nospor
To wtedy 16*3600+47*60.. no wiesz, podstawy matematyki... tongue.gif
peklo
nie no z tym 60 to juz wpadłeem wcześniej. Tylko teraz zastanawiiam się jak to zapisać. Trzeba to jakoś rozbić implode?
gerneralnie wszystkie zmienne mogą byc jako TIME tylko te nadgodziny jako mediumint
nospor
explode a nie implode
peklo
oj jasne że explode smile.gif A jak to rozbić?
nospor
kurcze.... zajrzyj do manuala... tam masz napisane jak uzywac explode....
peklo
explode to jaa już uzywałem ale nie wiem czy poradze sobie w tej petli z tym
nospor
A co za roznica czy w petli czy nie?? Dla explode to bez roznicy gdzie go uzywasz. Jak masz ochote to mozesz nawet go na Marsie uzywac
peklo
e no wole w domu. Cus takiego $nadgodziny=explode(':',$nadgodziny); ?
nospor
A masz zmienna $nadgodziny ktora jest w formacie GG:mm questionmark.gif Jak ta, to tak, Jak nie, to nie....
trueblue
peklo, czemu tą wartość wstawiasz do bazy? Możesz przecież nadgodziny liczyć na bieżąco podczas zapytania.
peklo
trueblue jak mam podgląd dodanego formularza to mi zlicza na bierząco. Czyli odejmuje jedno od drugiego. Ale ja potrzebuje jeszcze dodatkowo wrzucic to oddzielnie jako inna zmienna do tabeli podczas dodawania formularza
peklo
żle napisałem trueblue w poprzednim poście ale już poprawiłem post23. Musze zrobić tak jak pisze nospor czyli rozbić to na sekundy i dodać do tabeli jako nowa zmienna nadgodziny.
Wolałbym dodać to jako całe godziny ale chyba to nie wyjdzie. Ale mam jakąś ciemnośc i nie kumam jak mam rozbić te dwie zmienne , odjąc jedna od drugiej i pożniej to dodać
trueblue
Rozumiem Cię doskonale, ale może jeszcze spróbuję Cię naprowadzić:
  1. SELECT rozp_pracy,godz_powr,DATE_FORMAT(TIMEDIFF(godz_powr,rozp_pracy),'H%:%i') AS nadgodziny FROM czas

Sprawdź wynik.
peklo
próbowałem zapytaniem juz robic wcześniej podczas dodawania do bazy ale coś mi nie wychodziło:) Ale nie wiem czemu bo mam taki wynik H:00
czyli 09:00--8:00 powinno byc 1, a jest 0. Moze chodzi o strefe czasową?
trueblue
  1. SELECT rozp_pracy,godz_powr,DATE_FORMAT(TIMEDIFF(godz_powr,rozp_pracy),'%H:%i') AS nadgodziny FROM czas

Był błąd.
peklo
błędu w zapytaniu nie ma poprostu daje

rozp_pracy godz_powr nadgodziny
08:00:00 09:00:00 00:00

Może szczegół tkwi w tym że mam TIME a nie np TIMESTAMP
trueblue
Cytat(peklo @ 27.08.2015, 22:04:31 ) *
błędu w zapytaniu nie ma

W moim.


Cytat(peklo @ 27.08.2015, 22:04:31 ) *
Może szczegół tkwi w tym że mam TIME a nie np TIMESTAMP

Bez problemu działa u mnie na typie TIME.
peklo
hmm to ja nie wiem o co kaman. To zapytanie daje w konsoli SQL
trueblue
Na pewno masz typy TIME?
peklo
na 100%



zrobiłem tak

  1. SELECT TIMEDIFF( godz_powr, rozp_pracy ) AS nadgodziny FROM czas


i poszło
Jutro zobacze i pokombinuje jak dodać to do bazy
trueblue
Chodzi o to abyś nie dodawał do bazy tylko z niej wyciągał w razie potrzeby.
peklo
no nie za bardzo. Na jednej karcie na być godzina rozpoczecia pracy, godzina przyjazdu itd. Te godziny mają zostać na stałe dla potrzeb archiwizacji itd. Natomiast zmienna nadgodziny ma być odzielna zmienną, która będzie rozliczana i po rozliczeniu ustawiana na 0 h
trueblue
Utworzyłbym pole typu boolean, rozliczone 0/1.
Ale jak Ci wygodniej.
peklo
chyba że dodam nową zmienna rozliczone i dam 0 lub 1.
o o tym samym napisaliśmy w tym samym czasie:) Dzieki za pomoc Trueblue ja juz ide spać. Dzieki
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.