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

ベンのクエリを少し変更して、

 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')。そうしないと、ある時点でこれを間違えることになります。

現在の日付の15日前の日付が提供されるため、使用sysdate - 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'))

これには、OPが日付選択基準を使用する方法であるBETWEENを使用するという利点があります。

于 2017-09-20T03:17:40.267 に答える
1

OracleSQLDeveloperで私と一緒に働いています

    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 に答える