Potrzebuję napisać funkcję w SQL, która policzy mi pewien wskaźnik.
Piszę aplikację checklisty, w której zadania szeregują się pod względem najważniejszych, a określa to pewien czynnik który jest procentem. Algorytm, który wymyśliłem, zakłada że czynnik dla zadań z deadlinem (ustawionym czasem kiedy coś musi być zrobione) w momencie utworzenia ma wartość 0% a dla swojego deadlinu 100%.
Zatem dla tego rodzaju zadań (bo jest ich kilka, a czynnik musi być jeden żeby je wszystkie uszeregować) wzór na obliczenie "magicznego czynnika" wygląda tak:
Kod
(data_aktualna - data_utworzenia) w minutach
--------------------------------------
deadline
--------------------------------------
deadline
Do tej pory `deadline` był kolumną w bazie, do której wpisywane były minuty po których zadanie miało być wykonane. Wiem że to pokrętne, ale chodzi o to że niektóre zadania mogą dodatkowo być wykonywalne cyklicznie, więc tak mi było wygodniej.
Problem w tym, że wszystko się sypie, gdy zadanie ma być np wykonywane co miesiąc. Wartość pola `deadline`, która jest w minutach, zależy od ilości dni do ukończenia celu, a ilość dni zależy przecież od aktualnego miesiąca! Zatem niemożliwe jest ustawienie tego na sztywno.
Podsumowując problem:
Mam dwa rodzaje zadań (w rzeczywistości 4, ale problem tyczy się dwóch następujących):
- Zadania z deadlinem jednorazowe. Wpisujesz co do zrobienia, na kiedy, a następnie program liczy wskaźnik w/w wzorem. Po zrobieniu zadanie jest kasowane z bazy
- Zadanie z deadlinem powtarzalne - np "Zapłać za Internet" co miesiąc. Wskaźnik dla tego zadania jest również określony w/w wzorem. Po wykonaniu zadanie nie jest kasowane z bazy, tylko jego data utworzenia zmienia się na aktualną, dzięki czemu wskaźnik jest poprawnie obliczany
No i to nie działa gdy trzeba coś robić np co miesiąc - bo tego nie da się w prosty sposób zamienić na ilość dni / minut do końca. Czyli jeżeli to zadanie ma deadline wpisany na X minut, to raz będzie to faktycznie miesiącem, a raz nie.
Pomysł na rozwiązanie
Moim pomysłem na rozwiązanie jest zmiana rodzaju pola `deadline` na DATETIME, który zamiast daty będzie przechowywał ilość czasu (ile lat, ile miesięcy, ile dni, godzin, minut i sekund mimo że sekund nie potrzebuję) do planowanego wykonania.
Aby zamienić to na minuty, myślałem o tym żeby napisać coś w rodzaju funkcji w MySQLu, która będzie analizować aktualną datę (jaki miesiąc) i ewentualnie przeliczać to na potrzebne mi minuty.
Jeżeli to co napisałem jest jasne - czy będzie to dobre rozwiązanie?