日付時刻フォーマットモデル(Datetime Format Models)とは、データベースに格納される日付時刻データの形式を指定するものです。
日付時刻フォーマットモデルの全長は22文字を超えてはなりません。デフォルトではない形式の文字列値を日付時刻形式の値に変換する必要がある場合、関数内で日付時刻フォーマットモデルを使用できます。
日付時刻フォーマットモデルは、以下の関数で使用できます:
デフォルトではない形式の文字列値を日付時刻値に変換する際には、
TO_DATE、TO_TIMESTAMP、およびTO_TIMESTAMP_TZ関数のパラメータで日付時刻の形式を指定する必要があります。日付時刻値をデフォルトではない形式の文字列値に変換する際には、
TO_CHAR関数のパラメータで出力文字列の形式を指定する必要があります。
ユーザーが形式を指定しない場合、デフォルトの形式で変換が行われます。デフォルトの日付時刻形式は、システム変数 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT、または NLS_TIMESTAMP_TZ_FORMAT を使用して明示的に指定できます。これらの変数の値は、V$NLS_PARAMETERS システムビューで確認でき、また ALTER SESSION または ALTER SYSTEM コマンドで変数の値を変更できます。
日付時刻形式モデルの要素
日付時刻形式モデルは、1つまたは複数の日付時刻形式モデル要素で構成されます。OceanBaseデータベースがサポートする形式モデル要素については、日付時刻形式モデル要素表を参照してください。
書式が入力文字列の解析に使用される場合、同一の書式要素を2回使用したり、類似情報を表す書式要素を組み合わせたりすることはできません。例えば、日付時刻形式で
SYYYYとBCの両方の要素を同時に使用することはできません。このルールは、情報の重複による競合を避けるためです。一部の要素は、
TO_CHAR、TO_DATE、TO_TIMESTAMP、およびTO_TIMESTAMP_TZ関数では使用できません。日付時刻形式モデル要素
FF、TZD、TZH、TZM、およびTZRは、タイムスタンプおよび間隔型の形式に含めることができますが、DATE型の形式には含めることができません。一部の要素は固定長の文字列を生成し、長さが不足している場合は末尾にスペースが追加されます。
注意
4桁の年要素(
YYYY)を使用することを推奨します。短い年要素は、年が実行時にのみ決定できるため、クエリの最適化に影響を与えます。
日付時刻フォーマット要素表
| 要素 | TO_*関数に使用できるか | 説明 |
|---|---|---|
| - / , 。 ; : "テキスト" | はい | シンボル文字列定数です。 |
| AD A.D. | はい | 公元紀元を表します。ピリオドの有無は自由です。 |
| AM A.M. | はい | 午前を表します。ピリオドの有無は自由です。 |
| BC B.C. | はい | 紀元前の年を表します。ピリオドの有無は自由です。 |
| CC SCC | 不可 | 世紀を表します。 |
| D | 可 | 週の何日目(1~7)です。 |
| DAY | 可 | 日の名前です。結果の長さは固定されており、名前の最大長と同じです。 |
| DD | 可 | 月の何日目(1~31)です。 |
| DDD | はい | 一年の何日目(1~366)。 |
| DY | はい | 日の名前の略称。 |
| FF [1..9] | はい | 小数秒。1~9の数字を使用して、戻り値の小数点以下の部分の桁数、つまり精度を指定します。デフォルトは日付時刻データ型で指定された精度です。タイムスタンプと間隔形式では有効ですが、DATE形式では無効です。 |
| HH | はい | 時間(1~12)。 |
| HH12 | 不可 | 時間(1~12)。12時間表記 |
| HH24 | 可 | 時間(0~23)。24時間表記 |
| IW | 不可 | ISO基準に基づく年の何週目(1~52または1~53)。 |
| IYY IY I | 不可 | ISO年号の末尾3桁、2桁、または1桁。 |
| IYYY | 不可 | ISO規格に基づく4桁の年号を含みます。 |
| J | 可 | ユリウス日 |
| MI | 可 | 分(0~59)。 |
| MM | 可 | 月(01~12)。1月は01と表記され、以下同様です。 |
| MON | はい | 月の略称。 |
| MONTH | はい | 月の名称。結果の長さは固定されており、名称の最大長と同じです。 |
| PM P.M. | 不可 | 午後を表します。ピリオドは付けても付けなくても構いません。 |
| Q | 不可 | 季節(1、2、3、4)。1月~3月が第1四半期となります。以下同様です。 |
| RR | はい | 年の下2桁。入力した2桁と現在の年が前半か後半かによって、属する世紀が決まります。現在が前半であれば、0~49年を入力した場合は現在の世紀、50~99年を入力した場合は前の世紀となります。例えば、現在が2060年の場合、0~49年を入力した場合は次の世紀、55~99年を入力した場合は現在の世紀となります。 |
| RRRR | はい | 年。4桁または2桁の入力を受け付けます。2桁の場合はRRと同じです。 |
| SS | はい | 秒(0~59)。 |
| SSSSS | はい | その日の秒数(0~86400)。 |
| TZD | はい | 夏時間情報を含むタイムゾーンの略称。例えば、PSTはUS/Pacific標準時を表し、PDTはUS/Pacific夏時間を表します。タイムスタンプと間隔形式では有効ですが、DATE形式では無効です。 |
| TZH | はい | タイムゾーンの時間部分。タイムスタンプと間隔形式では有効ですが、DATE形式では無効です。 |
| TZM | はい | タイムゾーンの分部分。タイムスタンプと間隔形式では有効ですが、DATE形式では無効です。 |
| TZR | はい | タイムゾーンの地域情報。例えばUS/Pacific。タイムスタンプと間隔形式では有効ですが、DATE形式では無効です。 |
| WW | 不可 | 一年の何週目(1~53)。 |
| W | 不可 | 一ヶ月の何週目(1~5)。 |
| X | 可 | 小数点部分を区切るローカル文字。例:"HH:MI:SSXFF"。 |
| Y,YYY | 可 | コンマ付き年号。 |
| YEAR SYEAR | 不可 | 詳細を示す年。 |
| YYYY SYYYY | 可 | 4桁の年。接頭辞Sは、西暦以前の日付をマイナス記号で表すことを意味します。 |
| YYY YY Y | 可 | 年の末尾の3桁、2桁、または1桁。 |
説明
日付時刻関数とは、TO_CHAR、TO_DATE、TO_TIMESTAMP、および TO_TIMESTAMP_TZ を指します。
注意
- 表に示されている変換では、入力する文字列の日付がフォーマット要素と一致していなければ、エラーが報告されます。
- OceanBaseデータベースのデフォルトの日付形式は DD-MON-RR です。上記の形式で表示したい場合は、
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';を実行して現在のセッションの日付時刻形式を変更できます。
フォーマット文字列から一部の要素が欠落している場合、システムからエラーメッセージが返されます。
obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYY' ) FROM DUAL;
OBE-01830: date format picture ends before converting entire input string
日付フォーマットモデル要素の大文字
フォーマット内の要素の大文字と小文字は、生成される文字列の大文字と小文字に影響します。例えば、日付フォーマット要素 DAY が生成する MONDAY は大文字であり、Day が生成する Monday は大文字であり、day が生成する小文字の monday は小文字です。例を以下に示します。
obclient> SELECT TO_CHAR(sysdate,'mon') AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| mar |
+----------+
1 row in set
obclient> SELECT TO_CHAR(sysdate,'MON') AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| MAR |
+----------+
1 row in set
日付時刻フォーマットモデルにおける句読点と文字列定数
ユーザーはフォーマットに以下の文字を含めることができます。これらの文字は、返される値内でフォーマットモデル内の文字と同じ位置に現れます。
句読点。例えばハイフン、スラッシュ、カンマ、ピリオド、コロンなどです。
文字列定数は、ダブルクォーテーションマークで囲まれます。
OceanBaseデータベースは、文字列を柔軟に日付に変換できます。TO_DATE関数を使用する場合、入力文字列の各数字要素がフォーマットモデルで許可されている最大桁数を含む場合、フォーマット文字列は入力された文字列と一致します。
例
例1:フォーマット要素MM/YYでは、02はMMに、07はYYに対応します。
obclient> SELECT TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') FROM DUAL; +------------------------------------------+ | TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') | +------------------------------------------+ | 02/07 | +------------------------------------------+ 1 row in set例2:OceanBaseデータベースは、アルファベット数字以外の文字とフォーマット内の句読点文字のマッチングを許可しており、
#は/に対応します。obclient> SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL; +-------------------------------------------+ | TO_CHAR(TO_DATE('02#07','MM/YY'),'MM/YY') | +-------------------------------------------+ | 02/07 | +-------------------------------------------+ 1 row in set