多趣味まるの日常

跡取り息子を辞めたスーパー多趣味人間の日常や便利アイテムの紹介

【oracle】当年度 を求める【SQL】【仕事メモ】

こんにちは。まるです。

 

 

この記事は仕事のメモとなりますのでなんのこっちゃと思われる方が多いと思います。

 

 

雑記はまた別に投稿しますのでそちらを見ていただければなと思います。

 

 

ーーーーーーー【oracleで当年度を出す方法】ーーーーーーーーーー

※開発経験の浅い人間がメモで書いていますのでお読みになる方、実際に使う方は内容精査してから使っていただければと思います。

 

 

まず何に困ったかといえば、例えば現在が2020年1月1日~3月31日だった場合。

 

 

この期間というのは年度でいうと2019年度です。

 

 

なのである年月データが入っているカラムでWHEREする場合に

 

 

WHERE 当月度YYYY/MMカラム

BETWEEN  TO_CHAR(SYSDATE,'YYYY') ||'/04'

AND TO_CHAR(ADD_MONTHS(SYSDATE,12),'YYYY') ||'/04'

 

 

とやってしまうと、SYSDATEが2020年1月1日~3月31日であった場合 

当月度YYYY/MMカラム に2020/04以降のデータがある場合も拾ってしまいます。

 

 

なのでADD_MONTHS関数で "-3" してあげる必要があります。

 

 

これでどうなっても当年度が出せます。

 

 

 

例えば2020/04/01から-3なら2020/01/01。

2021/03/31ならば2020/12/31がそれぞれ得られます。

 

 

 

なので

 

WHERE 当月度YYYY/MMカラム

BETWEEN  TO_CHAR(ADD_MONTH(SYSDATE,-3),'YYYY') ||'/04'

AND TO_CHAR(ADD_MONTHS(SYSDATE,9)'YYYY') ||'/03'

 

 

こうすることでSYSDATEが2020年1月1日~3月31日であった場合でも問題なく当年度が取れるようになるわけです。

 

 

||'/04'する理由は、まずYYYY(当年度)だけを取得したいから。

 

 

YYYYだけを先に取得し、||'/04'でそのYYYYに/04をくっつけて、例えば2020/04とし、

YYYY/MMカラムと比較できるようにしています。

 

 

尚、何故 AND TO_CHAR(ADD_MONTHS(SYSDATE,9)'YYYY') ||'/03' かといえば、

2020/03/31であったとしても9ならば2020/12/31日が取得されるため年度がずれずに済むからです。

 

これが10~12とかにしてしまうと、2020/03/31であった場合に 2021/1/31~2021/03/31という数字を取得することになり、2019年度を取得したいのに2020年度の範囲を取得してしまうからです。

 

 

尚DATE型でない例えばCHAR型でデータが入っている場合は、先にTO_DATEしてあげないとADD_MONTHS関数は日付データとして拾ってくれませんので注意です。

 

 

以上メモでした。

 

 

尚、

BETWEEN CAST(TO_CHAR(add_months(SYSDATE, -3),'yyyy') || '/04/01' AS DATE)
AND CAST(TO_CHAR(add_months(SYSDATE, 9),'yyyy') || '/03/31' AS DATE)

のような書き方もあると某サイトで見ましたが、これだと当年度の範囲であるカラムのデータを取得したいといった場合に、YYYY/MMで保持されているカラムと比較することができないため、結局TO_CHARしてあげないといけない模様。