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' を使用することもできます。後者の方が便利です。
型 |
ゼロ値の形式 |
|---|---|
| DATE | '0000-00-00' |
| TIME | '00:00:00' |
| DATETIME | '0000-00-00 00:00:00' |
| TIMESTAMP | '0000-00-00 00:00:00' |
| YEAR | 0000 |