I am currently using the below statement to sucessfully get it
SELECT next_day(sysdate-7, 'Sunday') FROM dual;
Is there any more elegant way to get it? If I try to use last_day, it gives an error.
Advertisement
Answer
If you feel not comfortable with NLS session parameters, which is required for next_day
function, you can use trunc
function: truncate your date to ISO week, that starts from Monday, and subtract one day to get to Sunday.
But keep in mind, that Oracle’s date is essentially a date and time, and trunc
function sets all the lower granularity elements of date (lower than truncation unit) to their initial values, so you’ll get to the midnight of the previous Sunday. In contrast, next_day
preserves the time portion, so two dates retrieved with next_day
and trunc
will not be equal in full.
If you need to keep the same result, but without NLS dependency, you can do some interval calculations, that will preserve the time portion.
More about date and time format elements can be found in the documentation.
Below is all the above solutions compared:
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'
select --IW here stands for ISO week trunc(sysdate, 'IW') - 1 as dt_trunc, next_day(sysdate - 7, 'Sunday') as dt_next_day, --double quoted part in date format is needed to embed string constants in the format sysdate - to_dsinterval(to_char(sysdate, 'D "00:00:00"')) + 1 as dt_interval from dualDT_TRUNC | DT_NEXT_DAY | DT_INTERVAL :------------------ | :------------------ | :------------------ 2021-04-18 00:00:00 | 2021-04-18 18:02:42 | 2021-04-18 18:02:42
db<>fiddle here