web-dev-qa-db-ja.com

前月の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関数を使用する必要がありますか?

14
user803860

ベンのクエリを少し修正し、

 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))
44

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')
_

少しの側面として、元のクエリで日付に変換する明示的ではありません。 Always日付リテラル を使用してこれを行います。 _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
_
11
Ben

先月のデータ

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');
3
Annjawn

私はこれもうまくいくと信じています:

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が日付選択基準を使用する方法です。

1
kiltannen

過去nか月間のデータ取得の取得

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