OceanBase データベースの現在のバージョンでサポートされている日付・時刻関連のデータ型は、DATE、TIME、DATETIME、TIMESTAMP、YEAR です。各型の値には有効な範囲があります。
日付・時刻型を使用する際には、以下の点を考慮する必要があります:
OceanBase データベースは標準的な形式で日付・時刻型を出力しますが、ユーザー入力の値を複数の形式で解析しようと試みます。
OceanBase データベースはユーザー入力のリテラルを複数の形式で解析しようと試みますが、日付部分は「年-月-日」の順序である必要があります。例えば、'98-09-04' のように。月-日-年や日-月-年の順序、例えば '09-04-98' や '04-09-98' は無効です。「年-月-日」の順序を満たさない文字列を変換したい場合は、STR_TO_DATE 関数を使用できます。
入力された年が2桁の場合は曖昧さが生じます。どの世紀のものか判断できないためです。OceanBase データベースにおける1桁または2桁の年を変換するルールは、「70-99」の間の年は「1970-1999」に、「00-69」の間の年は「2000-2069」に変換されます。
日付・時刻型間で変換が発生する場合、ソース型が
DATE型でターゲット型がDATETIMEまたはTIMESTAMP型の場合、変換後の時刻部分は '00:00:00' となります。ソース型がTIME型でターゲット型がDATETIMEまたはTIMESTAMP型の場合、変換後の日付部分はシステムの現在日付となり、この日付はシステム変数timestampの影響を受けます。数値シナリオで日付・時刻関連型を使用する場合、例えば加算のパラメータとして使用する場合、OceanBase データベースはそれを数値型に変換します。その逆も同様です。
通常、値が日付または時刻型の有効範囲を超えるか無効な値である場合、OceanBase データベースはその型のゼロ値に変換します。例えば、
DATETIME型の場合、変換結果は '0000-00-00 00:00:00' となり、DATE型の場合は '0000-00-00' となります。例外として、範囲外のTIME値はTIME型の有効範囲の境界値に変換されます。SQL Mode を設定することで、OceanBase データベースがサポートする日付値を制御できます。例えば、SQL Mode に
ALLOW_INVALID_DATESを追加すると、データベースは '2009-11-31' のような日付値を受け入れるようになります。この場合、データベースは月が1~12の間に、日が1~31の間にあるかどうかのみをチェックします。SQL Mode からNO_ZERO_IN_DATEを削除すると、データベースは '2020-00-01' や '2020-01-00' のような日付値を受け入れるようになります。この場合、DATE_SUB や DATE_ADD などの関数を使用しても正しい結果が得られない可能性があります。OceanBase データベースは日付部分が '0000-00-00' の場合を許容します。ただし、型が
DATETIMEまたはTIMESTAMPの場合、時分秒の部分も同様に0でなければなりません。
以下の表は、日付・時刻関連の各型のゼロ値を示しています。ユーザーは表の値を明示的に使用してゼロ値を表すことも、0 または '0' を使用することもできます。後者の方が便利です。
データ型 |
NULL値の形式 |
|---|---|
| DATE | '0000-00-00' |
| TIME | '00:00:00' |
| DATETIME | '0000-00-00 00:00:00' |
| TIMESTAMP | '0000-00-00 00:00:00' |
| YEAR | 0000 |