SQL в соответствии с двумя неделями текущего месяца в Oracle Apex

#sql #oracle11g #oracle10g #oracle-apex #oracle-apex-5.1

Вопрос:

Мое имя таблицы-СЕАНСЫ. Мои поля для этой таблицы: SESSION_DATE (тип: дата), СЕАНСЫ.ЦЕНА (тип: Номер), СТАТУС (тип: Номер).

Я хочу, чтобы мой запрос показывал разные результаты в зависимости от текущего дня. если текущий день приходится на первые две недели месяца, покажите другие результаты, чем если бы он приходился на вторые две недели месяца.

Это мой вопрос:

 select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
  to_char(SESSION_DATE, 'Month YY') as CHARGE,
    sum(SESSIONS.PRICE) as PRICE
 from SESSIONS SESSIONS
 where SESSIONS.STATUS in (4,5)
 and SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
 group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
 order by to_char(SESSION_DATE, 'YYYYMM') Desc
 

Если мы находимся в первые две недели текущего месяца, то

 SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
 

ещё

 SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0))
 

Я пробовал что-то в этом роде:

 select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
  to_char(SESSION_DATE, 'Month YY') as CHARGE,
    sum(SESSIONS.PRICE) as PRICE
 from SESSIONS SESSIONS
 where SESSIONS.STATUS in (4,5)
 and SESSION_DATE = case when to_char(current_timestamp, 'dd') < 15 then
between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1))
else
between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0)) 
end
 group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
 order by to_char(SESSION_DATE, 'YYYYMM') Desc;
 

но это не сработало:(ORA-00905: отсутствует ключевое слово)

Я пробовал и это, но все равно ничего:

 select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
  to_char(SESSION_DATE, 'Month YY') as CHARGE,
    sum(SESSIONS.PRICE) as PRICE
 from SESSIONS SESSIONS
 where SESSIONS.STATUS in (4,5)
 and
    case when extract(day from current_timestamp) from dual < 15 then 
    (SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) 
                  and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),-1)))
    else 
    (SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP,'mm'),-13) 
                  and last_day(add_months(trunc(CURRENT_TIMESTAMP,'mm'),0))) 
    end
 group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
 order by to_char(SESSION_DATE, 'YYYYMM') Desc;
 

Я получаю эту ошибку:

ORA-20999: Не удалось проанализировать SQL-запрос! ORA-06550: строка 8, столбец 12: ORA-00907: отсутствует правая скобка

Ответ №1:

Вам не нужно case выражение в where предложении. Вы можете просто использовать обычные логические выражения:

 select to_char(SESSION_DATE, 'YYYYMM') as CHARGE_MONTH,
       to_char(SESSION_DATE, 'Month YY') as CHARGE,
       sum(SESSIONS.PRICE) as PRICE
from SESSIONS SESSIONS
where SESSIONS.STATUS in (4, 5) and
      ( (extract(day from SESSIONS.SESSION_DATE) <= 14 and
         SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -13) and last_day(add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -1))
        ) or
        (extract(day from SESSIONS.SESSION_DATE) > 14) and
         SESSIONS.SESSION_DATE between add_months(trunc(CURRENT_TIMESTAMP, 'mm'), -13) and last_day(add_months(trunc(CURRENT_TIMESTAMP, 'mm'), 0))
        )
      )
group by to_char(SESSION_DATE, 'YYYYMM'), to_char(SESSION_DATE, 'Month YY')
order by to_char(SESSION_DATE, 'YYYYMM') Desc;
 

Комментарии:

1. Спасибо Гордону Линоффу за потраченное время и ваш ответ! Я получаю эту ошибку: ORA-20999: Не удалось проанализировать SQL-запрос! ORA-06550: строка 6, столбец 44: ORA-00907: отсутствует правая скобка

2. @Apostolos . . . Я исправил опечатки.