Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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
 
Start new topic
Odpowiedzi
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
webdice
post
Post #3


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 #4





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

Posty w temacie


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

 



RSS Aktualny czas: 15.10.2025 - 13:58