OceanBaseデータベースの現行バージョンがサポートする日付時刻関連のデータ型には、DATE、TIME、DATETIME、TIMESTAMP、YEARが含まれ、各タイプの値には有効な範囲があります。
日付時刻型を使用する際には、以下の点を考慮する必要があります:
OceanBaseデータベースは、日付時刻型を標準的な形式で出力しますが、ユーザー入力値を複数の形式で解析しようとします。
OceanBaseデータベースは、ユーザー入力のリテラル値を複数の形式で解析しようとしますが、日付部分は「年-月-日」の順序に従わなければなりません。例えば、'98-09-04'のように、'09-04-98'や'04-09-98'のように「月-日-年」または「日-月-年」の順序ではありません。日付部分が「年-月-日」の順序に従わない文字列を変換したい場合は、STR_TO_DAT関数を使用できます。
入力された年が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 |