Подтвердить что ты не робот

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

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

select count(distinct switch_id)
  from [email protected]
 where dealer_name =  'XXXX'
   and TRUNC(CREATION_DATE) BETWEEN '01-AUG-2012' AND '31-AUG-2012'

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

4b9b3361

Ответ 1

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

 select count(distinct switch_id)   
  from [email protected]  
 where dealer_name =  'XXXX'    
   and creation_date between add_months(trunc(sysdate,'mm'),-1) and last_day(add_months(trunc(sysdate,'mm'),-1))

Ответ 2

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

select count(distinct switch_id)   
  from [email protected]  
 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

Ответ 3

Данные за последний месяц -

select count(distinct switch_id)
  from [email protected]
 where dealer_name =  'XXXX'
   and to_char(CREATION_DATE,'MMYYYY') = to_char(add_months(trunc(sysdate),-1),'MMYYYY');

Ответ 4

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

SELECT * FROM TABLE_NAME 
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE'; 

Ответ 5

Я считаю, что это также сработало бы:

select count(distinct switch_id)   
  from [email protected]  
 where 
   dealer_name =  'XXXX'    
   and (creation_date BETWEEN add_months(trunc(sysdate,'mm'),-1) and  trunc(sysdate, 'mm'))

У этого есть преимущество использования BETWEEN, который является тем, как OP использовал свои критерии выбора даты.