Зависит ли результат запроса от порядка выполнения функций 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

Почему эти запросы не дают одинаковый результат?

Какая разница между:

  1. Получить сегодняшний день без временной составлющей (усечь до полуночи).
  2. Затем получить последний день месяца.

И

  1. Получить последний день месяца (со временем).
  2. Затем избавиться от временной составлющей.

Свободный перевод вопроса 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
→ Ссылка