Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Godziny nocne/dzienne
Forum PHP.pl > Forum > Bazy danych > MySQL
xaxoo
Witam
Chcę zrobić skrypt który automatycznie będzie mi zliczał po podaniu godziny przyjscia i wyjścia czy są to godziny dzienne czy też nocne.

Przykład:
22:00 do 6:00 - godziny nocne (8 godzin)
5:45 - 14:00 - 15 min nocnych
21:45 - 6:30 - 8 godzin nocnych
18- 22:30 - 30 min nocnych itd.

Dane są zapisywane w minutach 0 - 1440 :
godz przyjścia (kolumna od) 22:00 - 1320 min godz wyjścia (kolumna do) 6:00 - 360min

Znalazłem coś takiego (w oryginale nie działa) pomodyfikowalem ale skrypt nie działa jak powinien - przy danych od 5:45 - 14:00 wykazuje 8:15 min nocnych... a ma być 15 min


istotą problemu jest uchwycić jeżeli dane w kolumnach od i do znajdują się w przedziale <360 i 1320< zapewniam nie jest to takie proste!



  1. $Evening_start = 18*60*60;
  2. $Evening_end = 22*60*60;
  3. $Night_start = 22*60*60;
  4. $Night_end = 06*60*60;
  5. $Midnight = 24*60*60;
  6. $Zero = 0;
  7.  
  8.  
  9. SELECT date , IF((`od` <> NULL),
  10. TIME_FORMAT(
  11. SEC_TO_TIME(
  12. GREATEST($Zero,
  13. LEAST($Night_end,TIME_TO_SEC(`do`))
  14. - GREATEST($Zero,TIME_TO_SEC(`od`)))
  15. + GREATEST($Zero,LEAST($Midnight,TIME_TO_SEC(`do`))
  16. - GREATEST($Night_start,TIME_TO_SEC(`od`)))),
  17. '%H:%i'),
  18. TIME_FORMAT(
  19. SEC_TO_TIME(
  20. (GREATEST($Zero,
  21. LEAST($Night_end,$Midnight)
  22. - GREATEST($Zero,TIME_TO_SEC(`od`)))
  23. + GREATEST($Zero,
  24. LEAST($Night_end,TIME_TO_SEC(`do`))))
  25. + GREATEST($Zero,
  26. $Midnight
  27. - GREATEST($Night_start,
  28. TIME_TO_SEC(`od`)))
  29. + GREATEST($Zero,
  30. LEAST($Midnight,
  31. TIME_TO_SEC(`do`))
  32. - GREATEST($Night_start,$Zero))),
  33. '%H:%i'))
  34. AS `night`".
  35. " FROM lista_daily WHERE ( `od_min` >= 840 OR `od_min` <= 360) AND `od_min` IS NOT NULL AND `id`=".$dayid."");
erix
Cytat
Chcę zrobić skrypt który automatycznie będzie mi zliczał po podaniu godziny przyjscia i wyjścia czy są to godziny dzienne czy też nocne.

To w końcu minuty, czy godziny? Bo z tego, co wypisałeś niżej, to minuty też. Czy może chcesz zaokrąglać do jednej godziny?

Napisz, czy do godzin, ja tymczasem pomyślę, bo przyznam, że problem ciekawy. [;
xaxoo
ja sobie to przeliczylem na minuty (bo mi tak wygodniej) ale efektem końcowym mają i tak być godziny
Dane jakie są zapisywane

Data od_godz od do do_godz
2009-04-01 22:00 1320 360 06:15


wiem ze to można było rozwalić inaczej ale tutaj mam dla wygody taką strukturę

Notabene efekt końcowy ma dać 8 i daje!! ale jak już przesuniemy przedział rozpoczęcia i zakończenia czyli np ktoś przyjdzie na 3:00 to już są cyrki.

Jest to raczej łamigłówka logiczna:)
erix
Hmm, ja to widzę w ten sposób:
  1. przedziały nocne wyznacz sobie zakresem minut (robisz zbiór 1300-1320 + 0-360)
  2. to samo robisz z przedziałem godzinowym
  3. wyznacz część wspólną z tych zbiorów
  4. podziel jak Ci trzeba (z zaokrąglaniem w górę dzielenia przez 60)
xaxoo
no trochę źle to widzisz:) rozpatruj wszystko w minutach OD może być zarówno 0 jak i 359 tutaj w zależności liczy się 1-360 min godzin nocnych.
Tak samo dla 1320 (22) do 1440 (24). Teraz schodki:

DO jest zależne od "od" ktoś przyjdzie na 15 i wychodzi o 23.
Teoretycznie zawsze jest to 8 godzin od jakiejś godziny. Problemem jest jak sprawdzać w zapytaniu sql czy `od` lub `do` znajdują się w tych przedziałach.

Dziękuję za pomoc
heaven
  1. SELECT IF(od<do,GREATEST(0,LEAST(6*60,do)-od)+GREATEST(0,do-GREATEST(od,22*60)),24*60-GREATEST(od,22*60)+GREATEST(0,6*60-od)+LEAST(do,6*60)+GREATEST(0,do-22*60)) godzin_noc_min FROM (SELECT 0 AS od, 1440 AS do) AS tab;


wydaje mi sie ze teraz działa smile.gif
xaxoo
dziękuję bardzo troszkę go zmodyfikowałem:) chyba działa jeszcze muszę przetestować wszystkie ewentualności:) ale wielki szacunek 4 łby siedziały nad tym:) no cóż ale nawet dwóch półgłówków jednej głowy nie czyni:D
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.