我有下面的查询,其中日期是硬编码的。我的目标是删除已编码的日期;查询应该在运行时提取上个月的数据。
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
功能吗?
答案 0 :(得分:42)
稍微修改Ben的查询,
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))
答案 1 :(得分:10)
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 literal执行此操作,例如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
答案 2 :(得分:3)
上个月的数据 -
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');
答案 3 :(得分:1)
我相信这也会奏效:
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使用其日期选择标准的方式。
答案 4 :(得分:0)
获取最近n个月的数据检索
SELECT * FROM TABLE_NAME
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE';
答案 5 :(得分:0)
它正在Oracle sql开发人员中与我一起工作
SELECT add_months(trunc(sysdate,'mm'), -1),
last_day(add_months(trunc(sysdate,'mm'), -1))
FROM dual