Функция даты 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';