• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetlenie ile minęło lat i miesięcy pomiędzy datami

Object Storage Arubacloud
0 głosów
502 wizyt
pytanie zadane 26 maja 2022 w SQL, bazy danych przez xTMx3 Obywatel (1,560 p.)

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. 

1 odpowiedź

0 głosów
odpowiedź 27 maja 2022 przez spamator12 Nałogowiec (28,230 p.)
Nie zajmuje sie na codzein bazami, ale data to po prostu zbior sekund. Jezeli od jednego zbioru odejmiesz drugi a potem sobie podzielisz na lata/miesiace/dni/godziny to otrzymasz wynik.

Odnosnie baz pobierasz jedno (date terazniejsza) i drugie pole (date "pracownika") i robisz kalkulacje, zwracajac gdzies na forum/komentarz/strone wynik. Mozna to zrobic na kilka sposobow, ale ten jest najbardziej intuicyjny, prosty, szybki.
komentarz 27 maja 2022 przez Oscar Nałogowiec (29,320 p.)
Tylko problem jest z tymi miesiącami - to taka "rozmyta" jednostka czasu, a zadanie jasno podaje, że ma być liczba "pełnych" miesiecy. Wynik zależy nie tylko od samej różnicy, ale i od punktu startowego - ta sama liczba sekund raz tworzy pełny miesiąc a kiedy indziej nie.

Podobne pytania

0 głosów
0 odpowiedzi 67 wizyt
0 głosów
2 odpowiedzi 439 wizyt
0 głosów
1 odpowiedź 463 wizyt
pytanie zadane 25 października 2017 w Java przez fusemul Użytkownik (710 p.)

92,666 zapytań

141,564 odpowiedzi

320,021 komentarzy

62,033 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...