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: 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? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%)
|
A ja bym poszedł innym tropem. Po pierwsze, nie liczyłbym miesięcy, tylko dni. No chyba że masz miesiące - ale co w przypadku, kiedy nieobecność trwa pół miesiąca (od 1szego do 15tego), a drugą połowę delikwent chodzi do pracy? Jeżeli przeliczasz na 0.5, to mój sposób może zadziałać.
A na czym mój sposób bazuje? Na lekkim brute-force, niestety (IMG:style_emoticons/default/smile.gif) Ale jest po pierwsze: skuteczny, po drugie: znacznie szybszy od Twojego (przetwarza 100 wpisów urlopowych w 0.02 sekundy, tak mi przynajmniej zeznaje microtime). I mimo że nie lubię rzucać gotowym kodem, to tym razem chyba się nie da. Za to komentarza nie będzie, bo powinien dokumentować się sam. (IMG:style_emoticons/default/smile.gif)
Hm, w zasadzie to przerobienie na liczenie miesięcy nie będzie takie trudne. Po explode pomijamy części $year i $day, tablicę $urlopy_dni zmieniamy np. na $urlopy_miesiace, o date i mktime zapominamy, a do tablicy wpisujemy "1", jeśli zahaczyliśmy o miesiąc. Tylko że znowu pozostaje pytanie: czy tydzień urlopu od 2012-02-27 do 2012-03-04 to "tylko" 5 dni urlopu czy "aż" dwa miesiące? Bo to chyba nie będzie to samo... EDIT Tak czytam jeszcze raz oryginalny post z problemem... i tak sobie myślę... najpierw dopisywanie, potem usuwanie duplikatów... Strasznie to skomplikowane - dopisywanie jest proste, owszem. Ale usuwanie duplikatów z tablicy, i to tak skonstruowanej jak u Ciebie? Bierzemy pierwszy element z pierwszej tablicy i szukamy go we wszystkich tablicach i usuwamy. Potem drugi element z pierwszej, trzeci. A potem pierwszy element z drugiej, tak? No to złożoność obliczeniową masz mega (IMG:style_emoticons/default/smile.gif) Rada: zmodyfikuj lekko swój algorytm i nie dodawaj całych dat, tylko rozbij to na rok i miesiąc i twórz indeksy i używaj w postaci
Ustawienie zmiennej nawet kilka tysięcy razy będzie dużo szybsze niż przeszukiwanie tablicy. A do liczenia elementów swojej tablicy masz szybkie i wygodne count() Ten post edytował abort 10.09.2012, 23:20:54 |
|
|
|
mlodyno [php] Sumowanie zakresów wielu dat 10.09.2012, 10:08:35
CuteOne Hmm trudna sprawa
[PHP] pobierz, plaintext while... 10.09.2012, 11:41:59 
mlodyno Cytat(CuteOne @ 10.09.2012, 12:41:59 ... 10.09.2012, 14:18:58
melkorm Tę pętle lepiej zamienić na:
[PHP] pobierz, plaint... 10.09.2012, 15:16:49
wNogachSpisz 1. Podziel na stringi "YYYMM"
2. Wrzuc d... 11.09.2012, 08:09:41
CuteOne Sposobów na rozwiązanie problemu jest masa... pyta... 11.09.2012, 08:14:29
wNogachSpisz @up odpowiedź masz w pierwszym poście.
Twój kod ni... 11.09.2012, 08:31:41
mlodyno Dziękuję wszystkim za aktywną pomoc. Testuję po ko... 13.09.2012, 12:43:53
abort Cytat(mlodyno @ 13.09.2012, 13:43:53 ... 13.09.2012, 14:19:18 ![]() ![]() |
|
Aktualny czas: 30.12.2025 - 04:09 |