社内SEの徒然なる日記

SQLで文字列の日付を加減算する

文字列の日付

文字列の日付っていうのは、日付が文字型(VARCHAR2)で"20130405"って感じで格納されているってことです。
こいつに対して、日付の加減算をしたいわけですよ。

ちなみに、環境はOracle11gです。

日の加減算

Oracleの場合、日付型への加減算は特殊な式を使う必要がなく、単純に日数を加えてやればOKです。
なので、TO_DATE関数を使用して、文字型から日付型に変換してやれば、簡単に日数計算ができます。


-- 2009年4月5日の135日後を求める。
TO_DATE('20090405', 'YYYYMMDD' ) + 135

-- 2013年3月4日の前日を求める。
TO_DATE('20130304', 'YYYYMMDD' ) - 1


ただ、これだと結果が日付型になってしまいます。
テーブルの格納値が文字型ってことは、周辺環境(更新する時や、アプリ側の共通部品など)でも、それを前提にしていると思われます。なので、TO_CHAR関数で8桁の文字型の日付に戻してやります。

TO_CHAR(TO_DATE('20090405' , 'YYYYMMDD' ) + 135, 'YYYYMMDD')


月の加減算

月の加減算を行う場合は、ADD_MONTHS関数を使用します。
この関数も、引数は日付型を前提としているので、TO_DATE関数を使用して、文字型から日付型に変換してから使用します。


-- 2012年1月31日の1ヶ月後を求める。
ADD_MONTHS(TO_DATE('20120131', 'YYYYMMDD'), 1)

第一引数が元の日付で、第二引数が加算する値ですね。

上の結果は、「2012/02/29」になります。きちんと、うるう年まで判定してくれるようです。
まぁ、そうでなければ使い物になりませんけどね。

そして、こちらも8桁の文字型日付で取得する場合は、TO_CHAR関数を使用します。

-- 1980年5月20日の3ヶ月前を求める。
TO_CHAR(ADD_MONTHS(TO_DATE('19800520', 'YYYYMMDD'), -3), 'YYYYMMDD')


同じことをやってもしかたないので、過去月を取得してみました。

年の加減算

この調子で、年の加減算もしたいのですが、どうやらOracleには年の加減算をする関数が存在しないようです。
なので、ADD_MONTHS関数を使用することになります。


-- 2012年2月29日の1年後を求める。
ADD_MONTHS(TO_DATE('20120229', 'YYYYMMDD'), 12)


こんな感じで、加算する月数に12を指定してやればOKです。
1年前って場合は、-12としてやれば良いです。

後書き

勤め先の基幹システムの日付の格納方式ってのが、ほとんどVARCHAR2の8桁文字なんですよね。まぁ、一部ではDATE型も使用してますけど。

入力画面の書式が、年・月・日でそれぞれフィールドを分ける作りにしているので、無理にDATE型を使うよりも、VARCHAR2型を使った方がやり易いのは確かなんでしょうけど。

ずっと社内SEとしてやってきているので、他社さんのシステムの内部構造ってあんまり見たことがないんですけど、一般的にはどうやってるんでしょうかね?

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する