Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » rurecznik 20:06
 » esteban 20:05
 » zibi13 20:04
 » adolphik 20:03
 » Sherif 20:03
 » siwydym 20:02
 » elliot_pl 19:49
 » DJopek 19:42
 » Curro 19:31
 » wrrr 19:28
 » waski 19:21
 » Draghmar 19:20
 » dugi 19:18
 » Wedelek 19:14
 » Kraszan 19:11
 » Katoda Lt 19:10
 » past 19:06
 » bajbusek 19:04
 » ripek 19:03
 » Master/Pe 19:03

 Dzisiaj przeczytano
 36863 postów,
 wczoraj 25433

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2025
A R C H I W A L N A   W I A D O M O Ś Ć
    

[Algorytmy] Ostatnie trzy miesiące , kubazzz 22/03/12 12:45
tytuł niewiele mówi, ale ciężko to opisać w jednym zdaniu.

Idea jest taka. Mamy n rekordów w bazie.
Każdy rekord ma pole z numerem miesiąca.
Rekordy obejmują 12 miesięcy wstecz, włącznie z aktualnym.

Aktualnie mogłyby tam być rekordy od kwietnia 2011 do marca 2012. W polu z numerem miesiąca 3 oznaczałoby marzec 2012, 4 oznaczałoby kwiecień 2011, a 12 grudzień 2011.

Chodzi o to, żeby zostawić rekordy z aktualnego miesiąca i dwóch poprzednich. [np. w styczniu zostają rekordy ze stycznia aktualnego roku oraz z grudnia i listopada poprzedniego roku].

Challenge pojawia się tutaj:
- jedyną dedykowaną funkcją systemową jest możliwości uzyskania i formatowania aktualnej daty. czyli nie ma możliwości użycia funkcji leave_last_two_months() ani tym podobnych.
- w praktyce zostaje prosta arytmetyka i chodzi jak najprostsze rozwiązanie tego (jak najmniej if'ów)
- dla usystematyzowania, dla każdego rekordu dokonywania jest osobno ocena, czyli coś w stylu
foreach row
{
if ... costam
{
stays
}
else
{
deleted
}
}


__

2. wariant - czy dałoby się to uprościć gdyby było dostępne pole z pełną datą [dd-mm-yyyy].

SM-S908

  1. W czym bedzie pisany kawalek kodu liczacy date? , ptoki 22/03/12 12:53
    Bo w php jest calkiem fajna metoda:
    <?php
    echo strtotime("now"), "\n";
    echo strtotime("10 September 2000"), "\n";
    echo strtotime("+1 day"), "\n";
    echo strtotime("+1 week"), "\n";
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
    echo strtotime("next Thursday"), "\n";
    echo strtotime("last Monday"), "\n";
    ?>


    Jesli chcesz elegancko to latwo nie bedzie (zmienna dlugosc miesiaca, lata przestepne itp.) zrobic tego na piechote.
    Ale moze po prostu akceptowalne jest zostawienie wszystkich rekordow nowszych niz ostatnie 100dni?

    Albo w baze wpisywac w jedno pole date a ten mechanizm po prostu bedzie bral te date i kasowal wszystko co starsze?

    Tylko trzeba zadbac zeby ta data nigdy nie byla zbyt mloda (bo sie pokasuje zbyt duzo...)

    1. inaczej , kubazzz 22/03/12 13:31
      nieistotny jest język [chociaż to akurat będzie visual basic].
      Pozyskanie numeru miesiąca aktualnego jest dosyć łatwe, a numer miesiąca dla każdego wiersza jest zapisany.

      Więc mam:

      $current_month = 3;
      $row_month = 2;


      i teraz musi być reguła, która będzie sprawdzać, czy $row_month spełnia kryteria.
      Gdyby nie to, że musi być uwzględniony poprzedni rok, to byłoby to super-proste ->> if($row_month > $current month or $row_month < ($current_month - 2) )
      {
      row_delete();
      }

      SM-S908

      1. jak na moje oko , gorky 22/03/12 13:58
        to

        if current_month - row_month < 0 then
        current_month+=12
        if current_month - row_month < 3 then
        row_delete()

        1. super , kubazzz 22/03/12 14:09
          dzięki. Też kombinowałem z dodawaniem 12, ale w sumie nie potrafiłem dojść do żadnych sensownych kalkulacji.
          Słaba kondycja :/

          SM-S908

  2. w mysql jednym zapytaniem , Deus ex machine 22/03/12 13:06
    to 'oczyscisz'

    "Uti non Abuti"

  3. modulo, czyli reszta z dzielenia , Grocal 22/03/12 14:07
    0 < ((aktualny_miesiac - sprawdzany_miesiac + 12) % 12) < 3

    Przykład:
    aktualny_miesiac = 5
    sprawdzany_miesiac:
    1 => (5-1+12) % 12 = 16 % 12 = 4
    ..
    4 => (5-4+12) % 12 = 13 % 12 = 1, itd.


    akutalny miesiac = 2 (luty)
    1 => (2-1+12) % 12 = 13 % 12 = 1

    11 => (2-11+12) % 12 = 3 % 12 = 3
    12 => (2-12+12) % 12 = 2 % 12 = 2, itd.

    O to chodzi?

    Na pewno, na razie, w ogóle...
    Naprawdę, naprzeciwko, stąd...
    Ortografia nie gryzie!

    
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL