Вы слишком усложняете ситуацию. Oracle TRUN C принимает дополнительный параметр для указания любого временного интервала для усечения:
SELECT TRUNC(some_date_here, 'MON') FROM dual
Если вы укажете some_date_here как sysdate, то в настоящее время он вернет 01-May-2020 до следующего месяца, когда он начинает возвращать 01-июн-2020
Вы можете обрезать до любого интервала; TRUN C 01.01.2000 12:34:56 с 'MI' вернет 01.01.2000 12:34:00. По умолчанию используется усечение до DD (сокращение времени). При усечении до ДНЯ дата возвращается к дню, с которого началась неделя в стране oracle думает, что это (вероятно, воскресенье или понедельник)
Дополнительная информация: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions230.htm#i1002084
Насколько я понял, ваша проблема должна быть go с текущей даты до первого числа месяца, которое было между 2 и <3 месяцами go (так что, если сейчас май, вы хотите go назад с первого марта до июня, когда вы хотите go вернуться к первому апреля) </p>
Если вы, следовательно, в текущую дату 5 мая захотите go вернуться к 1 марта, отсчитайте 2 месяца от текущей даты, а затем TRUN C до начала месяца:
SELECT TRUNC(ADD_MONTHS(sysdate, -2), 'MON') FROM dual
Не забудьте, что вы можете TRUN C до ближайшей четверти год, поэтому, если вы составляете отчет за «текущий квартал», то рассмотрение варианта TRUN C (sysdate, 'Q') будет способом go
Наконец , Я бы настоятельно просил вас НЕ использовать oracle для преобразования ваших дат в строки (в большинстве случаев) - если вы сохраните его как дату, все t Путь, пока он не попадет на компьютер пользователя, его можно отформатировать в соответствии с его региональными предпочтениями. Если вы примете решение в отношении формата выходящего дБ, это значительно усложнит предоставление хорошего международного опыта для вашего приложения