
Oracle SQLチューニング(第34回)「日データ関連関数紹介」(3/3回)
今回は、「日データ関連関数紹介」の3回目・最終回です。では、早速始めましょう。
8.3 日付と関連する便利な関数
8.3.1 TO_DATE & TO_TIMESTAMP & TO_CHAR(datetime)
・TO_DATE
Syntax : TO_DATE (CHAR [, FORMAT] [, nlsparam])
TO_DATEはCHAR,VARCHAR2,NCHAR,NVARCHAR2タイプをDATEタイプに変換する関数です。 もし、Formatを省略して実行する場合、CHARはDefault Date Formatと同一でなければなりません。 Default Date FormatはNLS_DATE_FORMATパラメーターを設定しなければNLS_TERRITORYで、NLS_DATE_FORMATパラメーターを設定すればNLS_DATE_FORMATとなります。
TO_DATEを使う時Formatを省略すればCHARがDefault Date Formatと同一でなければなりません。 SHOW PARAMETER NLS命令で確認してみれば、NLS_DATE_FORMATが設定されていないのでNLS_TERRITORY(AMERICA)と同一でなければならないのです。 したがって下記のように使うことで正常実行されます。
次に、RRからYyyyフォームで示される文字(「01-Jan-59」)を変更すると、年間形式が間違ったデータを取得する場合を見てみましょう。
通常、2059年1月1日の入力値でデータを検索しようとすると、to_date関数を使用します。 ただし、TO_DATEの引数として「DD-Mon-RR」を使用する場合、キャラクター「01-Jan-59」値の59が2059ではなく1959年に抽出されます。 2059年に書くことを意図している場合、これは間違ったデータを抽出します。 以下のさまざまな例を見てみましょう。
[使用例 : RR(RRRR) Datetime Format問い合わせ]
01 ~ 49 = 2001 ~ 2049
50 ~ 99 = 1950 ~ 1999
1945年を2045年で間違って抽出することを防ぐためには下記のように指定しなければなりません。
・TO_TIMESTAMP
TO_TIMESTAMPはCHAR,VARCHAR2,NCHAR,NVARCHAR2タイプをTIMESTAMPタイプに変換する関数です。 もし、Formatを省略すればCHARはNLS_TIMESTAMP_FORMATと同一でなければなりません。
[使用例]
・TO_CHAR(datetime)
Syntax : TO_CHAR ( DATE TIME [,FORMAT] [,nlsparam] )
TO_CHAR(DATETIME)はDATE,TIMESTAMP,TIMESTAMP WITH TIMEZONE,TIMESTAMP WITH LOCAL TIME ZONEタイプをVARCHAR2タイプに変換する関数です。
もし、Formatを省略すれば次の通りカラムのデータ タイプにより変換されます。
- DATEデータはDefault Date Formatに変換
- TIMESTAMP,TIMESTAMP WITH LOCAL TIME ZONEはDefault Timestamp Formatに変換
- TIMESTAMP WITH TIME ZONEはDefault Timestamp with time zone Formatに変換
[使用例]
・ADD_MONTHS
Syntax:ADD_MONTHS ( DATE (開始日時),INTEGER (加える月))
ADD_MONTHS関数はDATE (開始日時)にINTEGER (加える月)を計算してDATEをリターンします。 INTEGERが正数なら開始日時以後を、負数なら以前の日を抽出する。 INTEGERは0以外を使用することで、正確なデータを得ることができます。 ただし、月を計算する時小数点は無視されます。
[使用例]
・MONTHS_BETWEEN
Syntax : MONTHS_BETWEEN ( date1 , date2 )
Return : NUMBER Data Type
MONTHS_BETWEEN関数は二つの日の間を月で計算してNUMBERタイプでリターンします。 二つの日データのパターンにより下記のようにデータをリターンするので一般的なBETWEENと同じだと考えてはいけません。
date1 = date2 => 0
date1 < date2 => < 0
date1 > date2 => > 0
[使用例]
・LAST_DAY
Syntax : LAST_DAY (DATE)
LAST_DAY 関数は、係数値に対応する月の最終日を常に返します。 返されたデータ型は常にDATEです。
[使用例]
・NEXT_DAY
Syntax : NEXT_DAY (DATE [, format])
Return : Always DATE Type
Format:曜日
NEXT_DAY関数は、引数として日付データを受信し、フォーマット形式に適合する日付データを返します。 返されたデータ型は常にDATEです。
[使用例]
ORA-01846エラーが発生した場合は、NLS_DATE_LANGUAGEをチェックしてから、以下に示すようにセッション設定を設定し、SQLを実行します。]
1行にエラー: ORA-01846:指定した曜日が適合しません。
・ROUND
Syntax : ROUND( DATE[,format] )
日データをFormat形式に合うように四捨五入する関数です。
- ROUND( DATE ) =日付(12時の時点)
- ROUND( DATE,'YEAR' ) =年(6月現在)
- ROUND( DATE,'Q' ) =四半期(2ヶ月目の15日基準)
- ROUND( DATE,'MONTH' ) =月(15日基準)
- ROUND( DATE,'DD' ) =日付(12時の時点)
- ROUND( DATE,'HH24' ) =時間(30分基準)
- ROUND( DATE,'MI' ) =分(30秒基準)
- ROUND( DATE,'DAY' ) = その週が開始された日付
[使用例]
・TRUNC
Syntax : TRUNC( DATE[,format] )
これは、日付データをformat形式に削減する関数です。
- TRUNC( DATE ) =日付
- TRUNC( DATE,'YEAR' ) =年
- TRUNC( DATE,'Q' ) =四半期
- TRUNC( DATE,'MONTH' ) =月
- TRUNC( DATE,'DD' ) =日
- TRUNC( DATE,'HH24' ) =時間
- TRUNC( DATE,'MI' ) =分
- TRUNC( DATE,'DAY' ) = その週が始まった日
[使用例]
・EXTRACT
Syntax : EXTRACT (element FROM datetime)
EXTRACTはDATEやTIMESTAMPデータのみ抽出する時使われます。 Year,Month,DayはDATEから抽出でき、Hour,Minute,SecondはTIMESTAMPから抽出することができます。
ELEMENT
year
month
day
hour
minute
second
timezone_hour
timezone_minute
timezone_region
timezone_abbr
[使用例]
ここまで日データ演算に対して調べてみました。
最も難しい部分は日方式で保存されたCHARあるいはVARCHAR2タイプのデータに対する演算です。 なぜなら、演算する対象のデータ タイプと、関数をどのように使うかにより抽出しようと思う結果値が間違えるためです。 今まで前で調べてみた内容に対して正確な理解をしたとすれば、誤ったデータの抽出や発生可能なエラーから解放されるでしょう。
3回にわたってお伝えいたしました、「日データ関連関数紹介」は、皆様のOracle lifeに役立ちますでしょうか?
次回からは、「任意のデータを活用した効率的なSQLの作成」と題しまして、2回シリーズでお伝えいたします。
ご期待ください。それは、see you ^^