最近使用arcplan做报表,遇到不同日期粒度下展示数据的需求,利用sql直接从数据库中查询更为简便,且复用性强,记录下。
年粒度情况:展示当年前推5年的数据。
t.d_day>= add_months(to_date('2012'||'0101', 'yyyymmdd'),-60) and t.d_day<= last_day(to_date('2012'||'1201', 'yyyymmdd'))
半年粒度情况:展示当前半年前推12个数据点。
d_day>=add_months(to_date(substr('2011H2', 1, 4)||decode(substr('2011H2', 6, 6),1,'0101',2,'0701'), 'yyyymmdd') ,-72) and t3.d_day<=to_date(substr('2011H2', 1, 4)||decode(substr('2011H2', 6, 6),1,'0630',2,'1231'), 'yyyymmdd')
季粒度情况:展示当前季度前推12个数据点。
t.d_day>=add_months(to_date(substr('2012Q1', 1, 4)||decode(substr('2012Q1', 6, 6),1,'0101',2,'0401',3,'0701',4,'1001'), 'yyyymmdd') ,-36) and t.d_day<=to_date(substr('2012Q1', 1, 4)||decode(substr('2012Q1', 6, 6),1,'0101',2,'0401',3,'0701',4,'1001'), 'yyyymmdd')
月粒度情况:展示当前年所在12个月的数据,不足12个月前推。
t.d_day<=last_day(to_date('201204 ', 'yyyymm')) and t.d_day>add_months(last_day(to_date('201204', 'yyyymm')),-12)
旬粒度情况:展示当年季度前推12个点的数据。
t.d_day>= to_date(to_char(add_months(to_date(substr('201201X3', 1, 6), 'yyyymm'), -ceil(11 / 3) ), 'YYYYMM')||decode( to_char( case when to_number(substr('201201X3', 8, 1)) - mod(11, 3) > 0 THEN to_number(substr('201201X3', 8, 1)) - mod(11, 3) else to_number(substr('201201X3', 8, 1)) - mod(11, 3) + 3 END),1,'01',2,'11',3,'21'),'yyyymmdd') and t.d_day<= decode(substr('201201X3', 8, 8),1,to_date(substr('201201X3', 1, 6)||'10','yyyymmdd'),2,to_date(substr('201201X3', 1, 6)||'20','yyyymmdd'),3,last_day(to_date(substr('201201X3', 1, 6)||'01','yyyymmdd')))
周粒度情况:展示当年周前12个数据点。
t.d_day<= trunc(to_date(substr('2011W53', 1, 4) || '01' || '01', 'yyyymmdd'), 'IW') + 7 * to_number(substr('2011W53', 6, 2)) - 1 and t.d_day> trunc(to_date(substr('2011W53', 1, 4) || '01' || '01', 'yyyymmdd'), 'IW') + 7 * to_number(substr('2011W53', 6, 2)) - 1 - 12 * 7
日粒度情况:展示当前月30天,不足30天前推30天。
t.d_day<=to_date('20120326 ', 'yyyymmdd') and t.d_day>(to_date('20120326', 'yyyymmdd')-30)