Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zliczenie godzin dla dowolnego zakresu
webdice
post
Post #1


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Witam,

mam problem ze zliczaniem czasu pracy dla godzin nocnych. Godziny nocne mamy od 22 do 6 rano. W jaki sposób ułożyć zapytanie które zliczy ilość godzin nocnych i zwykłych dla dowolnego zakresu godzin. Przykładowo:

  1. mając zmianę od 20 do 10, mamy 6 godzin zwykłych oraz 8 godzin nocnych,
  2. mając zmianę od 23 do 11, mamy 5 godzin zwykłych oraz 7 godzin nocnych,
  3. mając zmianę od 23 do 05, mamy 0 godzin zwykłych oraz 6 godzin nocnych,
  4. mając zmianę od 10 do 15, mamy 5 godzin zwykłych oraz 0 godzin nocnych


Chodzi mi po głowie rozwiązanie z warunkami, ale nie jest zbyt eleganckie.
Go to the top of the page
+Quote Post
vieri_pl
post
Post #2





Grupa: Zarejestrowani
Postów: 406
Pomógł: 9
Dołączył: 24.07.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Dołączam się do pytania.

Znalazłem rozwiązanie w EXCEL'u: http://www.mrexcel.com/forum/showthread.php?t=427914

Na stacku też coś jest: http://stackoverflow.com/questions/8914360...tween-two-dates

Myślę, że może to ze stacka wystarczy przerobić i zrobić tablicę $hours z kluczami day, night?
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Proste ify nie wystarczą, bo ktoś może zaczac zmianę np. o 21 a skończyć o 7 rano.

Dlatego ja bym się nie szczypał tylko dał 24 ify, po jednym dla każdej godziny, jeśli warunek jest spełniony dodajemy jeden do puli godzin nocnych lub dziennych. Niestety wtedy nici z elegancji, chyba, że użyjemy pętli:
http://dev.mysql.com/doc/refman/5.0/en/loop-statement.html

No i jest jeszcze kwestia minut, ale zakładam chodzi tylko o pełne godziny.
Go to the top of the page
+Quote Post
webdice
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




~vieri_pl rozwiązanie w PHP kompletnie mnie nie interesuje.

Kod
SELECT * FROM `TIME`;
+---------------------+---------------------+
| FROM                | TO                  |
+---------------------+---------------------+
| 2012-04-25 21:00:00 | 2012-04-25 07:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 07:00:00 |
| 2012-04-25 21:00:00 | 2012-04-25 05:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 05:00:00 |
| 2012-04-25 07:00:00 | 2012-04-25 19:00:00 |
| 2012-04-26 00:00:00 | 2012-04-26 06:00:00 |
+---------------------+---------------------+


  1. SELECT `FROM`, `TO`, SEC_TO_TIME( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) AS `DAY`, SEC_TO_TIME( MOD( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 + IF( SIGN( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 ), 1, 0 ), 1 ) * 24 * 3600 - ( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) ) AS `NIGHT` FROM `TIME`


Kod
+---------------------+---------------------+----------+----------+
| FROM                | TO                  | DAY      | NIGHT    |
+---------------------+---------------------+----------+----------+
| 2012-04-25 21:00:00 | 2012-04-25 07:00:00 | 02:00:00 | 08:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 07:00:00 | 01:00:00 | 07:00:00 |
| 2012-04-25 21:00:00 | 2012-04-25 05:00:00 | 01:00:00 | 07:00:00 |
| 2012-04-25 23:00:00 | 2012-04-25 05:00:00 | 00:00:00 | 06:00:00 |
| 2012-04-25 07:00:00 | 2012-04-25 19:00:00 | 12:00:00 | 00:00:00 |
| 2012-04-26 00:00:00 | 2012-04-26 06:00:00 | 00:00:00 | 06:00:00 |
+---------------------+---------------------+----------+----------+

6 rows in set (0.00 sec)

Przesadziłem, ale działa.
Go to the top of the page
+Quote Post
bpskiba
post
Post #5





Grupa: Zarejestrowani
Postów: 340
Pomógł: 49
Dołączył: 3.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


  1. SELECT `FROM`, `TO`, SEC_TO_TIME( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) AS `DAY`, SEC_TO_TIME( MOD( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 + IF( SIGN( TIMEDIFF( TIME( `TO` ), TIME( `FROM` )) / 24 / 10000 ), 1, 0 ), 1 ) * 24 * 3600 - ( ( IF( `FROM` > `TO`, 1, 0 ) * IF( LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24, 16 / 24 ) < 0, 0, LEAST( ( TIME( `TO` ) / 24 / 10000 ) - 6 / 24,16 / 24 ) ) + GREATEST( 0, LEAST( 22 / 24, ( TIME( `TO` ) / 24 / 10000 ) + IF( `FROM` > `TO`, 1, 0 ) ) - GREATEST( 6 / 24, ( TIME( `FROM` ) / 24 / 10000 ) ) ) ) * 24 * 3600 ) ) AS `NIGHT` FROM `TIME`

WOW
robi wrażenie

Ten post edytował bpskiba 27.04.2012, 21:24:35
Go to the top of the page
+Quote Post
webdice
post
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Źle wylicza minuty. Dla pełnych godzin działa prawidłowo. Mój post powinien być ukryty.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 07:09