Witam,
ćwicząc sobie różnego rodzaju zapytania w Oracle SQL Developerze zauważyłem, że w wielu przypadkach mam problem, gdy przychodzi "obliczyć" coś na podstawie dwóch dat. Zacząłem więc ćwiczyć tego typu zapytania, aż tu nagle trafiłem na takie polecenie:
"Create a report of employees and their length of employment. Show the last names of all the employees together with the number of years and the number of completed months that they have been employed. Order the report by the length of their employment. The employee who has been employed the longest should appear at the top of the list."
Poniżej jest przykład, jak powinien wyglądać wynik zapytania (zdjęcie było dołączone razem z pytaniem):

Jeśli dobrze rozumiem treść, chodzi o to, żeby wyświetlić nazwiska pracowników oraz ile minęło lat i miesięcy od czasu zatrudnienia danego pracownika, do dnia dzisiejszego. Problem mam właśnie z tymi miesiącami, bo z tego co wnioskuję po obrazku, nie chodzi o ilość wszystkich miesięcy jaka upłynęła od daty podanej w tabeli do dziś, tylko ma być to jakoś tak, że przykładowo: aktualnie mamy miesiąc maj, a miesiąc zatrudnienia pracownika podany w tabeli to sierpień, no to od sierpnia do maja jest 10 miesięcy. Natomiast gdyby dzisiejsza data również wskazywała że mamy miesiąc sierpień, wtedy w tym wierszu liczba miesięcy byłaby równa 0.
Nie wiem na ile dobrze wytłumaczyłem swój tok rozumowania, bo trudno mi ubrać to co mam na myśli w słowa, ale mam nadzieję że jednak da się coś z tego zrozumieć.
Udało mi się napisać polecenie, które realizuje to zadanie według tego mojego toku rozumowania, ale wyszło mi ono dosyć długie:
SELECT LAST_NAME, ROUND(((MONTHS_BETWEEN(SYSDATE, HIRE_DATE)) / 12),0) YEARS,
CASE WHEN TO_CHAR(HIRE_DATE, 'MM') >= 6 THEN (12 - (TO_CHAR(HIRE_DATE, 'MM') - TO_CHAR(SYSDATE, 'MM'))) ELSE TO_CHAR(SYSDATE, 'MM') - TO_CHAR(HIRE_DATE, 'MM') END AS MONTHS FROM EMPLOYEES
ORDER BY YEARS DESC;
Pomimo tego, że powyższe zapytanie działa, odnoszę wrażenie, że istnieje jakiś dużo krótszy i prostszy sposób rozwiązania tego zadania, na który po prostu nie mogę wpaść. Czy mógłby ktoś rzucić na to okiem i podpowiedzieć czy dobrze w ogóle zrozumiałem przekaz w poleceniu i jeśli tak, to w jaki sposób można by prościej rozwiązać to zadanie (o ile rzeczywiście da się prościej)?
Z góry dziękuję za wszelkie odpowiedzi.