文字列を日付型に変換、和暦を西暦に変換

TO_DATE ( string [, format [, nls_param]] )
return [ datetime ]

日付書式のフォーマット文字列
各国語サポートパラメータ
NLS_CALENDAR についてはグローバリゼーション・サポート・ガイド参照
| nls_param の種類 | 設定例 |
| NLS_DATE_LANGUAGE | ENGLISH |
| NLS_CALENDAR | 'JAPANESE IMPERIAL'(要クォート) |
TO_DATE 関数の内容
文字列式 string をフォーマット文字列 format で日付型に変換する。
フォーマット文字列 format が省略されると NLS_DATE_FORMAT 書式が使用される。NLS_DATE_FORMAT 環境変数 または、セッションパラメータ。
TO_DATE 使用例
SQL> select str, fmt, TO_DATE(str, fmt) from to_date_sample1;
STR FMT TO_DATE(STR,FMT)
------------------------------ ------------------------------ -------------------
05-10-01 RR-MM-DD 2005-10-01 00:00:00
05-10月-01 RR-MON-DD 2005-10-01 00:00:00
991231235859 RRMMDDHH24MISS 1999-12-31 23:58:59
991231235859 YYMMDDHH24MISS 2099-12-31 23:58:59
2004-05-06 07:08:09 RRRR-MM-DD HH24:MI:SS 2004-05-06 07:08:09
2005-06-30 00:05:20 YYYY-MM-DD HH24:MI:SS 2005-06-30 00:05:20
Oracle 10g において MON 日付書式による月の表記が変更されている。
NLS_DATE_LANGUAGE が「日本」環境の場合に MON 書式で有効な日付要素は「n月」となる。Oracle 9i 以前では JAN などの英名表記で指定する。
Oracle 9i 以前の場合
SQL> select TO_DATE('05-OCT-01', 'YY-MON-DD')
2 from dual;
TO_DATE('05-OCT-01'
-------------------
2005-10-01 00:00:00
Oracle 10g で同じ表記を使用したい場合には NLS_DATE_LANGUAGE で使用言語を明記する。
SQL> select to_date('05-OCT-01', 'YY-MON-DD', 'NLS_DATE_LANGUAGE=ENGLISH'),
^^^ ^^^^^^^
2 to_date('05-10月-01', 'YY-MON-DD', 'NLS_DATE_LANGUAGE=JAPANESE')
^^^^ ^^^^^^^^
3 from dual;
TO_DATE('05-OCT-01' TO_DATE('05-10月-01
------------------- -------------------
2005-10-01 00:00:00 2005-10-01 00:00:00
ユリウス日 (Julian Day Number)
SQL> select to_date(1, 'J') from dual;
TO_DATE(1,'J')
-------------------
4712-01-01 00:00:00 -- 起算時間(PM:0時)は切り捨てられている
和暦表記の文字列を西暦の日付型に変換する例
TO_DATE の各国語サポートパラメータ nls_param を使用することで年号を使った和暦表記文字列を日付に変換することもできる。
SQL> select
2 TO_DATE('H19-01-01', 'EYY-MM-DD', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') e_date
3 from dual;
E_DATE
-------------------
2007-01-01 00:00:00
SQL> select
2 TO_DATE('平成19-01-01', 'EEYY-MM-DD', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') ee_date
3 from dual;
EE_DATE
-------------------
2007-01-01 00:00:00
書式 EYY/EEYYY ⇒ 書式モデル(日付)
取り扱い注意:TO_DATE の nls_param 指定について NLS_CALENDAR の表記が グローバリゼーション・サポート・ガイド と SQL マニュアルでは E/EE 書式は TO_datetime ファンクションでの使用が 「いいえ」 で相反した内容になっている。
利用できる機能をまだ明記しないことはあっても使用することを否定している事はめずらしい。現状では使ってよいかわからない状態の機能。マニュアルの誤記であることが確認できるか 「サポートから使用のお墨付きをもらってから」プログラム中で使用するほうが良いだろう。(Oracle 10g R2 現在)
セッションパラメータ(初期化パラメータ) NLS_CALENDAR='JAPANESE IMPERIAL'
を設定する方法もある。
確認が取れない場合に和暦表記から西暦への変換方法 ⇒
セッションパラメータで和暦の日付を入力させる方法
日付フィールドの補完に関する豆知識
日付フィールドの自動補完
TO_DATE は YYYY/MM/DD HH24:MI:SS のフィールドを全て指定する必要がない。
自動的に日付として適切になるように空白部が補完される。
現在日付が 2001年12月31日 23時59分59秒における日付要素の補完例
TO_DATE('2000', 'YYYY') ⇒ 2000/12/01 00:00:00
TO_DATE('12 23', 'MM HH24') ⇒ 2001/12/01 23:00:00
TO_DATE('30', 'SS') ⇒ 2001/12/01 00:00:30
補正値表
| フィールド | デフォルト値 |
| 年 | 現在の年 |
| 月 | 現在の月 |
| 日 | 1 日 |
| 時 | 0 時 |
| 分 | 0 分 |
| 秒 | 0 秒 |
NLS_DATE_FORMAT、NLS_CALENDAR の現在値
SQL> select * from V$NLS_PARAMETERS
2 where parameter in ('NLS_DATE_FORMAT', 'NLS_CALENDAR');
PARAMETER VALUE
-------------------------- ------------------------------
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS
SQL> alter session set nls_calendar='JAPANESE IMPERIAL';
SQL> select * from v$nls_parameters
2 where parameter in ('NLS_DATE_FORMAT', 'NLS_CALENDAR');
PARAMETER VALUE
-------------------------- ------------------------------
NLS_CALENDAR Japanese Imperial
NLS_DATE_FORMAT EEYY"年"MM"月"DD"日"
SQL 関数 - TO_DATE 関連
関連事項