以下に、日付がハードコードされているクエリを示します。私の目的は、ハーコードされた日付を削除することです。クエリは、実行時に前月のデータを取得する必要があります。
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
関数を使用する必要がありますか?
ベンのクエリを少し修正し、
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))
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
_
先月のデータ
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');
私はこれもうまくいくと信じています:
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が日付選択基準を使用する方法です。
過去nか月間のデータ取得の取得
SELECT * FROM TABLE_NAME
WHERE DATE_COLUMN BETWEEN '&STARTDATE' AND '&ENDDATE';