Функция даты Oracle за предыдущий месяц

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

select count(distinct switch_id)
  from xx_new.xx_cti_call_details@appsread.prd.com
 where dealer_name =  'XXXX'
   and TRUNC(CREATION_DATE) BETWEEN '01-AUG-2012' AND '31-AUG-2012'

Должен ли я использовать sysdate-15 функция для этого?

5 ответов

Решение

Немного изменив запрос Бена,

 select count(distinct switch_id)   
  from xx_new.xx_cti_call_details@appsread.prd.com  
 where dealer_name =  'XXXX'    
   and creation_date between add_months(trunc(sysdate,'mm'),-1) and last_day(add_months(trunc(sysdate,'mm'),-1))

trunc() функция усекает дату до указанного периода времени; так trunc(sysdate,'mm') вернет начало текущего месяца. Затем вы можете использовать add_months() функция, чтобы получить начало предыдущего месяца, что-то вроде этого:

select count(distinct switch_id)   
  from xx_new.xx_cti_call_details@appsread.prd.com  
 where dealer_name =  'XXXX'    
   and creation_date >= add_months(trunc(sysdate,'mm'),-1) 
   and creation_date < trunc(sysdate, 'mm')

Как небольшая сторона, вы явно не конвертируете дату в исходный запрос. Всегда делайте это, используя литерал даты, например DATE 2012-08-31, или to_date() функция, например to_date('2012-08-31','YYYY-MM-DD'), Если вы этого не сделаете, то вы обязательно ошибетесь в какой-то момент.

Вы бы не использовали sysdate - 15 поскольку это обеспечит дату за 15 дней до текущей даты, которая, кажется, не соответствует вашей. Он также будет включать компонент времени, так как вы не используете trunc(),


Так же, как маленькая демонстрация того, что trunc(<date>,'mm') делает:

select sysdate
     , case when trunc(sysdate,'mm') > to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as gt
     , case when trunc(sysdate,'mm') < to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as lt
     , case when trunc(sysdate,'mm') = to_date('20120901 00:00:00','yyyymmdd hh24:mi:ss')
             then 1 end as eq
  from dual
       ;

SYSDATE                   GT         LT         EQ
----------------- ---------- ---------- ----------
20120911 19:58:51                                1

Данные за прошлый месяц

select count(distinct switch_id)
  from xx_new.xx_cti_call_details@appsread.prd.com
 where dealer_name =  'XXXX'
   and to_char(CREATION_DATE,'MMYYYY') = to_char(add_months(trunc(sysdate),-1),'MMYYYY');

Я считаю, что это также будет работать:

select count(distinct switch_id)   
  from xx_new.xx_cti_call_details@appsread.prd.com  
 where 
   dealer_name =  'XXXX'    
   and (creation_date BETWEEN add_months(trunc(sysdate,'mm'),-1) and  trunc(sysdate, 'mm'))

Преимущество использования BETWEEN заключается в том, что OP использует свои критерии выбора даты.

Он работает со мной в разработчике Oracle sql

    SELECT add_months(trunc(sysdate,'mm'), -1),
           last_day(add_months(trunc(sysdate,'mm'), -1)) 
    FROM dual

Получение данных за последние n месяцев

SELECT * FROM TABLE_NAME 
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE'; 
Другие вопросы по тегам