ADD_MONTHSは日付dataSrcにNヵ月後の結果を返します。その月の最終日を越える場合は、日の部分はその月の最終日を返します。02-02-28ADD_MONTHSの例としてADD_MONTHS(SYSDATE,13)はシステム日付の1年と1ヵ月後の日付を返します。最後のADD_MONTHS(TO_DATE('2002/01/31'),1)は1ヶ月後の2月には31日は存在しない為、2月の最終日が結果として帰ります。DECODEは<式1>を<判定値1>から判定し等しい場合はその<結果値1>を返します。<判定値2>,<判定値3>...と処理を進めます。そのデフォルト値を返します。全て一致しない場合はNULLを返します。このDECODEを利用することで1個のSQL文の中でIF~THEN~ELSEの処理を記述することができます。OTHER4番目のDECODEは結果をNULLを返していますが、以下のSQLであればNULLであることがはっきりします。NULL.その他のDECODEの便利な使い方としては、DECODEの結果とCOUNT,SUM等の関数を組み合わせるといろいろな応用が利くと思います。以下に、EMP表を用いてDEPTNO毎の件数とSALの合計を計算しています。9400上のSELECT文の件数を取得する部分を以下のSELECT文の様にCOUNT()関数を用いても可能です。COUNTはNULL値を計数しないのでDECODEのデフォルト値をNULLにしています。LAST_DAYは日付dataSrcの末日の日付を返します。一般の言語の様に別に関数を設ける必要がありません。03-02-28この例は2000年から2003年の2月の末日を求めています。閏年の計算をしなくても簡単に行えます。04-02-29LAST_DAYは日付部分は月末を返すが、時刻部分は指定日付型の時刻をそのまま引き継ぐ様です。上のSQLを見ると良くわかるとは思いますが、もし時刻が00:00:00が必要であればTRUNC関数で切り捨てる必要があります。EXTRACTはexp1の指定された日時フィールドを返します。7上記のSQLでは2~4行では年,月,日の値をそれぞれ返し、6~8行では時,分,秒を返します。6~8のTIMESTAP型データをDATE型に変更するとエラーが発生します。時,分,秒を取得するにはTIMESTAP型データでなければならない様です。MONTHS_BETWEENはdate1とdate2の間の月数を返します。date2がdate1より大きい場合は負の値を返します。結果は整数の値になります。その他の場合は、1ヶ月を31日とした換算値が返されます。1上記に、いろいろな場合のMONTHS_BETWEENの結果を示します。問題があるとすれば、閏年の場合には29日を1ヶ月として計算しているようである。1月31日には月末の処理がなされて結果は1ヶ月の差として返されている。このあたりは、月数を処理する場合には注意が必要かもしれません。MONTHS_BETWEENの応用として、年齢の計算について以下に示します。strReplaceが指定されていない場合は置換えではなく一致する部分を削除します。BBBCCCCDDDDDこの例では最初は置換え処理を、2番目には削除処理を示しています。変換文字列strTranslateの対応する文字に置換します。strTranslateがstrSearchより短い場合は、strSearchに対応する文字を削除します。あいDETRANSLATEの注意点は、取扱が文字単位でありバイト単位ではないことです。シングルバイト文字とマルチバイト文字との変換が可能です。1回のTRANSLATEでは不可能ですので、PL/SQLで自分で関数を作るしかないかもしれません。ROUNDは数値データnumberSrcを小数点以下numberUnit桁までに丸めた数値を返します。numberUnitが省略されると0(ゼロ)と指定したことと同様で、小数点以下を丸めます。numberUnitが負の場合は、小数点から見てnumberUnit*(-1)の位置の桁を丸めます。ROUNDは日付データdateSrcをdateFormatに従って丸めた日付を返します。dateFormatが省略されると最も近い日に丸められます。場合は0(ゼロ)を返し、numberSrcが0(ゼロ)より大きい場合は1を返します。numberSrcは数値を返す式を指定できます。1このSIGN関数と前述のDECODE関数を組み合わせることで、割と複雑なことが可能になります。以下に簡単な例を示します。1500未満14行が選択されました。SUBSTRは文字列stringSrcのnumberPos番目からnumberLen文字分の文字列を返します。(stringSrcの文字列の数え方は先頭が1として処理します。numberPosが0(ゼロ)の場合は1として処理します。numberLenを指定しない場合は、stringSrcのnumberPos番目から最後までの文字列を返します。INSTRは文字列stringSrcのnumberPos番目からstringChk文字列を検索します。numberOcr回数の検索ができた位置を結果として返します。(stringSrcの文字列の数え方は先頭が1として処理します。numberPos及びnumberOcrのデフォルトは1として処理します。19実際のテーブルを使用した例を以下に示します。商品マスタを例に取りますが、商品名の中に”-”が含まれていますが、それを検索して商品名の前半と後半に分ける処理をさせます。最初に商品マスタの一覧を示します。12000013行が選択されました。SUBSTR関数の引数の中に、INSTRの結果を渡しています。文字列の中を検索して、文字列の抽出や置換えにはこの様な方法が使えると思います。##13行が選択されました。実際のSQL/PLUSでこのSQLを実行すると、各カラムの長さが非常に長くなり各行が1行では表示できなくなります。この場合には、PLUSのコマンドのCOLUMNを使用して表示カラムの、表示形式を設定すれば1行で表示可能になります。dataSrcそのものを返します。戻り値のデータ型はdataSrcのデータ型と同じになります。NVL2はデータdataSrcがNULLの場合dataNullを結果として返し、NULL以外の場合dataNotNullを返します。データ型に変換します。戻り値のデータ型はdataNotNullのデータ型と同じになります。dataNotNullが文字列型の場合はVRACHAR2型になります。