トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

3-40 指定月を年度開始とした年度を求める

SQLパズル

テーブル
yyyymm
------
200801
200802
200803
200804
200805
200812
200901
200902
200903
200904
200905
200906

4月を年度開始とした年度を求める。
6月を年度開始とした年度を求める。

出力結果
yyyymm  nendo4  nendo6
------  ------  ------
200801  200700  200700
200802  200700  200700
200803  200700  200700
200804  200800  200700
200805  200800  200700
200812  200800  200800
200901  200800  200800
200902  200800  200800
200903  200800  200800
200904  200900  200800
200905  200900  200800
200906  200900  200900
200907  200900  200900


SQL

select yyyymm,
trunc(yyyymm-4,-2) as nendo4,
trunc(yyyymm-6,-2) as nendo6
from (select 200801 as yyyymm from dual union
      select 200802 from dual union
      select 200803 from dual union
      select 200804 from dual union
      select 200805 from dual union
      select 200812 from dual union
      select 200901 from dual union
      select 200902 from dual union
      select 200903 from dual union
      select 200904 from dual union
      select 200905 from dual union
      select 200906 from dual union
      select 200907 from dual);


解説

年度をグループ化したり、
年度でパーティションを切る
といった用途に使えるでしょう。

3-39 午前10時を基準としてグループ化

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
date型の場合は、下記のようになります。

col nendo4-1 for a10
col nendo6-1 for a10

select yyyymm,
to_char(yyyymm - interval '3' month,'yyyy') as "nendo4-1",
trunc(yyyymm - interval '3' month,'yyyy')   as "nendo4-2",
to_char(yyyymm - interval '5' month,'yyyy') as "nendo6-1",
trunc(yyyymm - interval '5' month,'yyyy') as "nendo6-2"
from (select date '2008-01-01' as yyyymm from dual union
      select date '2008-02-01' from dual union
      select date '2008-03-01' from dual union
      select date '2008-04-01' from dual union
      select date '2008-05-01' from dual union
      select date '2008-12-01' from dual union
      select date '2009-01-01' from dual union
      select date '2009-02-01' from dual union
      select date '2009-03-01' from dual union
      select date '2009-04-01' from dual union
      select date '2009-05-01' from dual union
      select date '2009-06-01' from dual union
      select date '2009-07-01' from dual);

yyyymm    nendo4  nendo6
--------  ------  ------
08-01-01  2007    2007
08-02-01  2007    2007
08-03-01  2007    2007
08-04-01  2008    2007
08-05-01  2008    2007
08-12-01  2008    2008
09-01-01  2008    2008
09-02-01  2008    2008
09-03-01  2008    2008
09-04-01  2009    2008
09-05-01  2009    2008
09-06-01  2009    2009
09-07-01  2009    2009

マニュアル(期間リテラル)より引用
INTERVAL '50' MONTH
は、
50か月(4年2か月)を示します。