日付時刻書式モデル(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日のうちの日付(1~7)。 |
| DAY | はい | 日の名前。結果の長さは固定されており、名前の最大長と同じになる。 |
| DD | はい | 1月のうちの日付(1~31)。 |
| DDD | はい | 1年のうちの日付(1~366)。 |
| DY | はい | 日の名前の略称。 |
| FF [1..9] | はい | 小数秒。1~9の数字を使用して、戻り値の小数秒部分の桁数、つまり精度を指定します。デフォルトは日付時刻データ型が指定する精度です。タイムスタンプと間隔形式で有効ですが、DATE 形式では無効です。 |
| HH | はい | 時間(1~12)。 |
| HH12 | いいえ | 時間(1~12)。12時間制 |
| HH24 | はい | 時間(0~23)。24時間制 |
| IW | いいえ | 一年の何週目か(1〜52または1〜53)、ISO規格に基づく。 |
| IYY IY I | いいえ | ISO年の末尾3、2、または1文字。 |
| IYYY | いいえ | 4文字の年号、ISO規格に基づく。 |
| 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