|
OBECNI NA TPC |
|
|
» PeKa 06:38 » cVas 06:33 » NimnuL 06:15 » NWN 05:07 » Shark20 02:49
Dzisiaj przeczytano 41106 postów, wczoraj 25974
Szybkie ładowanie jest: włączone.
|
|
|
|
|
|
TwojePC.pl © 2001 - 2024
|
|
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 - 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...)- 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 - 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()- 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
- w mysql jednym zapytaniem , Deus ex machine 22/03/12 13:06
to 'oczyscisz'"Uti non Abuti" - 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-2024, TwojePC.PL |
|
|
|
|