日付時刻フォーマットモデル(Datetime Format Models)とは、データベースに格納される日付時刻データの形式を指定するものです。
日付時刻フォーマットモデルの全長は22文字を超えてはなりません。デフォルトではない形式の文字列値を日付時刻形式の値に変換する必要がある場合は、関数内で使用可能な日付時刻フォーマットモデルを利用できます。
日付時刻フォーマットモデルは、1つまたは複数の日付時刻フォーマット要素で構成されます。文字列値を日付値に変換する際には一定の変換ルールに従う必要があります。詳細については、文字列から日付への変換ルールを参照してください。
RR 日付時刻フォーマット要素は YY 日付時刻フォーマット要素と似ていますが、世紀をまたぐ日付値の格納においてより高い柔軟性を提供します。RR日付時刻フォーマット要素の詳細については、RR日付時刻フォーマット要素を参照してください。
関数内の日付時刻フォーマットモデル
日付時刻フォーマットモデルは、以下の関数で使用できます:
デフォルトではない形式の文字列値を日付時刻値に変換する場合、
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 | はい | 4桁の年。現在のバージョンでは紀元前の日付はサポートされていません。 |
| 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
日付時刻フォーマット要素とグローバル化のサポート
OceanBaseデータベースでは、日付時刻フォーマット要素の言語はパラメータ NLS_DATE_LANGUAGE および NLS_LANGUAGE で指定できます。デフォルト値は AMERICAN であり、変更ができないため、グローバル化はサポートされていません。
例:日付時刻フォーマットの言語パラメータはデフォルトで American であり、他の言語はサポートされていません。
SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') FROM DUAL;
クエリ結果にエラーが報告され、言語パラメータがサポートされていないことを示します。
OBE-12702: invalid NLS parameter string used in SQL function