21

我有下面的查询,其中日期是硬编码的。我的目标是删除硬编码日期;查询应在运行时提取上个月的数据。

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为此使用函数吗?

4

6 回答 6

63

稍微修改一下 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))
于 2012-09-11T21:06:40.497 回答
16

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
于 2012-09-11T18:42:44.947 回答
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');
于 2012-09-11T21:00:38.227 回答
2

我相信这也会起作用:

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 使用其日期选择标准的方式。

于 2017-09-20T03:17:40.267 回答
1

它在 Oracle sql developer 中与我合作

    SELECT add_months(trunc(sysdate,'mm'), -1),
           last_day(add_months(trunc(sysdate,'mm'), -1)) 
    FROM dual
于 2020-11-23T09:30:25.127 回答
0

获取最后 n 个月的数据检索

SELECT * FROM TABLE_NAME 
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE'; 
于 2016-09-03T06:05:57.663 回答