Между с переменными для запуска и остановки предыдущих месяцев

#oracle

#Oracle

Вопрос:

Я использую следующее WHERE с sysdate, чтобы получить диапазон between .

 WHERE TO_CHAR(mopstart, 'yyyy-mm-dd hh24:mi:ss') BETWEEN TO_CHAR(sysdate,'YYYY-MM-DD')||' 21:00:00' AND TO_CHAR(sysdate 1,'YYYY-MM-DD')||' 20:59:59' 
 

Мой вопрос в том, как мне создать BETWEEN с переменными для даты, чтобы вернуть дату начала и окончания предыдущих месяцев?

Ответ №1:

Обычно вы не используете BETWEEN для этого. Как и в реальной жизни, вы бы не сказали «время с начала прошлого месяца до конца прошлого месяца», а просто «в прошлом месяце», так что вы бы сделали в SQL.

Зная, что месяц на самом деле является годом и месяцем:

 where extract(year from mopstart) = extract(year from sysdate) 
and extract(month from mopstart) = extract(month from sysdate) - 1 
 

Или:

 where to_char(mopstart,'yyyymm') = to_char(add_months(sysdate,-1),'yyyymm')
 

Ответ №2:

Если я вас хорошо понимаю, это было бы:

 where ... between trunc(add_months(sysdate, -1), 'MON') and trunc(sysdate, 'MON') - 1
 

Еще одна вещь: не используйте TO_CHAR для сравнения дат, просто используйте даты и интервалы.