Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Sumowanie zakresów wielu dat, Czyli ile miesięcy minęło między podanymi zakresami dat
mlodyno
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.10.2008

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


Witam,

chciałbym obliczyć ilość miesięcy jaka upłynęła między datami. Nie jest to standardowy przypadek ponieważ trzeba wziąć pod uwagę zazębianie się dat. Najłatwiej przedstawić to na przykładzie urlopów

1. Urlop między 2012-01-01 a 2012-06-31
2. Urlop między 2012-04-01 a 2012-07-31
3. Urlop między 2012-05-01 a 2012-05-31
4. Urlop między 2012-10-01 a 2012-11-31

Pytanie: ile miesięcy był na urlopie? (oczywiście zazębienie dat powinno być wykrywane na etapie dodawania urlopów, ale potrzebuje to do innego skryptu a na przykładzie urlopów najłatwiej wytłumaczyć).

Urlop 1,2 i 3 jest zazębiony. Oczywiście daty mogą być zazębione w różny inny sposób.
W wyniku powinienem dostać odpowiedź: 9 miesięcy, czyli nie jest to suma(urlop1;urlop2;urlop3;urlop4).


Do tej pory poradziłem sobie tak, że wpisuje do tablicy miesiące poszczególnych urlopów czyli:
  1. $tab = array(2012-01-01, 2012-02-01, 2012-03-01, 2012-04-01.... , 2012-06-01),
  2. array(2012-04-01, 2012-05-01, 2012-06-01, 2012-07-01),
  3. array(2012-05-01),
  4. array(2012-10-01, 2012-11-01) );

I teraz usuwam duplikaty i otrzymuje unikalne miesiące, których suma daje mi długość urlopów.
Problem w tym, że wykonuje się to bardzo długo, bo 7 minut dla 7000 rekordów (w końcu powyższe operacje wykonuje osobno dla każdego rekordu).

Może inne pomysły związane z operacjami na zakresach dat?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Hmm trudna sprawa (IMG:style_emoticons/default/smile.gif)

  1. while($row = mysql_fetch_assoc()) {
  2.  
  3. $start = explode('-', $row['start']);
  4. $end = explode('-', $row['end']);
  5.  
  6. for($y=$start[0]; $y <= $end[0]; $y++) {
  7.  
  8. // pętla dla miesięcy
  9.  
  10. $array[$y][$m] = 1;
  11. }
  12. }
  13. }
  14.  
  15.  
  16. $array = array(
  17. '2012' => array(
  18. '01'=>1,
  19. '02'=>1,
  20. '03'=>1,
  21. '04'=>1,
  22. '08'=>1,
  23. '09'=>1
  24. )
  25. );

sumujesz miesiące w poszczególnych latach i gotowe

Ten post edytował CuteOne 10.09.2012, 11:44:48
Go to the top of the page
+Quote Post
mlodyno
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.10.2008

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


Cytat(CuteOne @ 10.09.2012, 12:41:59 ) *
Hmm trudna sprawa (IMG:style_emoticons/default/smile.gif)

sumujesz miesiące w poszczególnych latach i gotowe


wygląda ok i na pierwszy rzut oka powinno działać. Po południu sprawdzę, choć rzuca się w oczy pętla dla miesięcy. Jeśli w 2011 roku był start od października do 2012 stycznia to pętla będzie od 10 do 1.
Go to the top of the page
+Quote Post

Posty w temacie


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: 27.12.2025 - 21:22