Зависит ли результат запроса от порядка выполнения функций LAST_DAY и TRUNC?
Не получаю ожидаемый результат при комбинациии функций LAST_DAY и TRUNC:
select LAST_DAY (TRUNC (sysdate, 'DAY')) from dual;
LAST_DAY(TRUNC(SYSD
-------------------
2021-07-31 00:00:00
select TRUNC (LAST_DAY (sysdate), 'DAY') from dual;
TRUNC(LAST_DAY(SYSD
-------------------
2021-07-26 00:00:00
Почему эти запросы не дают одинаковый результат?
Какая разница между:
- Получить сегодняшний день без временной составлющей (усечь до полуночи).
- Затем получить последний день месяца.
И
- Получить последний день месяца (со временем).
- Затем избавиться от временной составлющей.
Свободный перевод вопроса LAST_DAY and TRUNC - order of execution от участника @michelson
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Маска формата даты DAY в функции TRUNC означает, как это не странно, первый день недели, а не начало дня.
Чтобы усечь дату до полуночи (или избавится от временной составлющей), надо использовать маску DD (синонимы DDD, J). Она используется по умолчанию и указывать её не обязательно:
select trunc (last_day (sysdate)) from dual
/
TRUNC(LAST_DAY(SYSD
-------------------
2021-07-31 00:00:00