Мне нужно получить дату первого понедельника предыдущего месяца для запроса Oracle.
ms SQL равно
select dateadd (day, (9 - datepart(dw, eomonth(getdate(), -2)))%7, eomonth(getdate(), -2))
, но нет dateadd функция в Oracle.
dateadd
Здесь вы go:
SQL> alter session set nls_date_language = 'english'; Session altered. SQL> alter session set nls_date_Format = 'dd.mm.yyyy day'; Session altered. SQL> SQL> select next_day(add_months(trunc(sysdate, 'mm'), -1), 'monday') first_monday 2 from dual; FIRST_MONDAY -------------------- 02.03.2020 monday SQL>
Что он делает?
SYSDATE
'mm'
1
add_months
next_day
'monday'
Вы можете использовать:
TRUNC(TRUNC(add_months(dt, -1), 'mm') + 6, 'iw')
Это вычитает месяц из указанной даты, усекает его до 1-го числа месяца, затем добавляет к нему 6 дней, прежде чем окончательно урезать его до начала iso. неделя (которая всегда является понедельником).
Вам нужно добавить 6 к первому числу месяца, чтобы соответствующий понедельник считался первым понедельником месяца (в противном случае вы можете выбрать последний понедельник). за предыдущий месяц.
Вы можете видеть, как он работает [здесь [(https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c25bc32b3223b954e8fcb02b9b76ffd5)