Czasem potrzebujemy do naszej aplikacji wyznaczenie konkretnej daty. Najczęściej chcemy ustalić pierwszy czy ostatni dzień miesiąca.
Z ostatnim dniem miesiąca nie ma najmniejszego problemu. Oracle wyposażył nas w dedykowaną funkcję LAST_DAY. Funkcja ta wyznacza nam ostatni dzień miesiąca dla daty przekazanej parametrem.
select last_day(sysdate) from dual;
A co z pierwszym dniem miesiąca? Nie ma funkcji typu first_day...
Jednym ze sposobów jest ustalenie pierwszego dnia miesiąca "na piechotę". Jest to konstrukcja dość ekwilibrystyczna lecz najczęściej przeze mnie spotykana w kodzie aplikacji.
select to_date('01-'|| to_char(sysdate, 'mm-yyyy'), 'dd-mm-yyyy') pierwszy_dzien from dual;
Da się? da się. Ale może jest bardziej elegancki sposób?
Otóż jest i to bardzo elegancki. Znana nam doskonale funkcja TRUNC!
Trunc najczęściej stosujemy do danych numerycznych w celu obcięcia części dziesiętnej albo do dat, w celu obcięcia godzin i minut. Ale TRUNC ma również wiele innych zastosowań. Między innymi możemy za pomocą tej funkcji ustawić pierwszy dzień miesiąca!
select trunc(sysdate, 'MONTH') from dual;
Funkcja ma jeszcze więcej możliwości: możemy ustawić pierwszy dzień kwartału, pierwszy dzień tygodnia, pierwszy dzień roku itp
O wszystkich możliwości TRUNC'a można przeczytać w dokumentacji :D
-- Przyda się do harmonogramowania wykonania raportu tuż przed 24tą
OdpowiedzUsuń-- czas data - ostatni dzien miesiaca i godzina 23:58
select trunc(last_day(sysdate)) + (1-120/(60*60*24)) from dual;