重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

日付と時刻のタイプ

TiDBは、時間値を格納するためにすべてのMySQL YEARおよび時刻データ型をサポートしTIME DATETIME DATE 、およびTIMESTAMP 。詳細については、 MySQLの日付と時刻のデータ型を参照してください。

これらの各タイプには有効な値の範囲があり、ゼロ値を使用して無効な値であることを示します。さらに、 TIMESTAMPタイプとDATETIMEタイプは、変更時に新しい時間値を自動的に生成できます。

日付と時刻の値タイプを扱う場合は、次の点に注意してください。

  • TiDBはさまざまな形式を解釈しようとしますが、日付部分は、月-日-年または日-月-年ではなく、年-月-日の形式(たとえば、「1998-09-04」)である必要があります。

  • 日付の年部分が2桁で指定されている場合、TiDBは特定のルールに基づいてそれを変換します。

  • コンテキストで数値が必要な場合、TiDBは日付または時刻の値を自動的に数値タイプに変換します。例えば:

    mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
    +---------------------+----------------+--------------------+
    | NOW()               | NOW()+0        | NOW(3)+0           |
    +---------------------+----------------+--------------------+
    | 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
    +---------------------+----------------+--------------------+
    
  • TiDBは、無効な値またはサポートされている範囲を超える値を、そのタイプのゼロ値に自動的に変換する場合があります。この動作は、SQLモードセットに依存します。例えば:

    mysql> show create table t1;
    +-------+---------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                            |
    +-------+---------------------------------------------------------------------------------------------------------+
    | t1    | CREATE TABLE `t1` (
      `a` time DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
    +-------+---------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select @@sql_mode;
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | @@sql_mode                                                                                                                                |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> insert into t1 values ('2090-11-32:22:33:44');
    ERROR 1292 (22007): Truncated incorrect time value: '2090-11-32:22:33:44'
    mysql> set @@sql_mode='';                                                                                                                                                                                                                     Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t1 values ('2090-11-32:22:33:44');
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    mysql> select * from t1;
    +----------+
    | a        |
    +----------+
    | 00:00:00 |
    +----------+
    1 row in set (0.01 sec)
    
  • 異なるSQLモードを設定すると、TiDBの動作が変わる可能性があります。

  • SQLモードNO_ZERO_DATEが有効になっていない場合、TiDBでは、 DATE列とDATETIME列の月または日をゼロ値にすることができます(例:「2009-00-00」または「2009-01-00」)。この日付タイプを関数で計算する場合、たとえばDATE_SUB()またはDATE_ADD()の場合、結果が正しくない可能性があります。

  • デフォルトでは、TiDBはSQLモードNO_ZERO_DATEを有効にします。このモードは、「0000-00-00」などのゼロ値の保存を防ぎます。

次の表に、さまざまなタイプのゼロ値を示します。

日付タイプ「ゼロ」値
日にち'0000-00-00'
時間'00:00:00'
日付時刻'0000-00-00 00:00:00'
タイムスタンプ'0000-00-00 00:00:00'
0000

無効なDATEDATETIMEは、SQLモードでそのような使用が許可されている場合、対応するタイプのゼロ値('0000-00-00'または'0000-00-00 00:00:00')に自動的に変換されTIMESTAMP

サポートされているタイプ

DATE

DATEには日付部分のみが含まれ、時間部分は含まれず、 YYYY-MM-DDの形式で表示されます。サポートされる範囲は「0000-01-01」から「9999-12-31」です。

DATE

TIMEタイプ

TIMEタイプの場合、形式はHH:MM:SS[.fraction]で、有効な値の範囲は「-838:59:59.000000」から「838:59:59.000000」です。 TIMEは、1日の時間を示すだけでなく、2つのイベント間の時間間隔を示すためにも使用されます。分数秒の精度を指定するために、0〜6の範囲のオプションのfsp値を指定できます。省略した場合、デフォルトの精度は0です。

TIME[(fsp)]

ノート:

TIMEの省略形に注意してください。たとえば、「11:12」は「00:11:12」ではなく「11:12:00」を意味します。ただし、「1112」は「00:11:12」を意味します。これらの違いは、 :文字の有無によって発生します。

DATETIMEタイプ

DATETIMEには、日付部分と時間部分の両方が含まれます。有効な値の範囲は、「0000-01-01 00:00:00.000000」から「9999-12-3123:59:59.999999」です。

TiDBはDATETIMEの値をYYYY-MM-DD HH:MM:SS[.fraction]の形式で表示しますが、文字列または数値のいずれかを使用してDATETIMEの列に値を割り当てることができます。分数秒の精度を指定するために、0〜6の範囲のオプションのfsp値を指定できます。省略した場合、デフォルトの精度は0です。

DATETIME[(fsp)]

TIMESTAMPタイプ

TIMESTAMPには、日付部分と時間部分の両方が含まれます。有効な値の範囲は、UTC時間で「1970-01-0100:00:01.000000」から「2038-01-1903:14:07.999999」です。分数秒の精度を指定するために、0〜6の範囲のオプションのfsp値を指定できます。省略した場合、デフォルトの精度は0です。

TIMESTAMPでは、月の部分または日の部分にゼロを表示することは許可されていません。唯一の例外は、ゼロ値自体「0000-00-0000:00:00」です。

TIMESTAMP[(fsp)]

タイムゾーンの処理

TIMESTAMPを格納する場合、TiDBはTIMESTAMPの値を現在のタイムゾーンからUTCタイムゾーンに変換します。 TIMESTAMPを取得する場合、TiDBは保存されているTIMESTAMPの値をUTCタイムゾーンから現在のタイムゾーンに変換します(注: DATETIMEはこの方法では処理されません)。各接続のデフォルトのタイムゾーンはサーバーのローカルタイムゾーンであり、環境変数time_zoneで変更できます。

警告

MySQLと同様に、 TIMESTAMPのデータ型には2038年問題の影響があります。 2038を超える可能性のある値を格納する場合は、代わりにDATETIMEタイプの使用を検討してください。

YEARタイプ

YEARタイプは、「YYYY」の形式で指定されます。サポートされている値の範囲は1901〜2155、またはゼロ値0000です。

YEAR[(4)]

YEARは、次のフォーマット規則に従います。

  • 4桁の数字の範囲は1901年から2155年です
  • 4桁の文字列の範囲は「1901」から「2155」です。
  • 1桁または2桁の数字の範囲は1〜99です。したがって、1-69は2001-2069に変換され、70-99は1970-1999に変換されます。
  • 1桁または2桁の文字列の範囲は「0」から「99」です。
  • 値0は0000と見なされ、文字列「0」または「00」は2000と見なされます。

無効なYEARの値は自動的に0000に変換されます(ユーザーがNO_ZERO_DATE SQLモードを使用していない場合)。

TIMESTAMPDATETIMEの自動初期化と更新

TIMESTAMPまたはDATETIMEの値タイプの列は、現在の時刻に自動的に初期化または更新できます。

テーブル内の値タイプがTIMESTAMPまたはDATETIMEの列の場合、デフォルト値または自動更新値を現在のタイムスタンプとして設定できます。

これらのプロパティは、列の定義時にDEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMPを設定することで設定できます。 DEFAULTは、 DEFAULT 0DEFAULT '2000-01-01 00:00:00'などの特定の値として設定することもできます。

CREATE TABLE t1 (
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

NOT NULLとして指定されていない限り、 DATETIMEのデフォルト値はNULLです。後者の場合、デフォルト値が設定されていない場合、デフォルト値は0です。

CREATE TABLE t1 (
    dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
    dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);

時間値の小数部分

DATETIMETIMESTAMPの値には、ミリ秒単位で正確な最大6桁の小数部分を含めることができます。 DATETIMEまたはTIMESTAMPタイプの列では、小数部分は破棄されるのではなく保存されます。小数部の場合、値は「YYYY-MM-DD HH:MM:SS [.fraction]」の形式で、小数部の範囲は000000〜999999です。小数部をから分離するには小数点を使用する必要があります。休み。

  • type_name(fsp)を使用して、小数精度をサポートする列を定義しTIMESTAMP type_nameTIME 、またはDATETIMEです。例えば、

    CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
    

    fspは0から6の範囲でなければなりません。

    0は、小数部分がないことを意味します。 fspを省略した場合、デフォルトは0です。

  • 小数TIMESTAMP TIME DATETIMEするときに、小数部の桁数が少なすぎる、または多すぎる場合は、状況に応じて丸めが必要になることがあります。例えば:

    mysql> CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> INSERT INTO fractest VALUES
         > ('17:51:04.777', '2014-09-08 17:51:04.777',   '2014-09-08 17:51:04.777');
    Query OK, 1 row affected (0.03 sec)
    
    mysql> SELECT * FROM fractest;
    +-------------|------------------------|------------------------+
    | c1          | c2                     | c3                     |
    +-------------|------------------------|------------------------+
    | 17:51:04.78 | 2014-09-08 17:51:04.78 | 2014-09-08 17:51:04.78 |
    +-------------|------------------------|------------------------+
    1 row in set (0.00 sec)
    

日付と時刻のタイプ間の変換

日付と時刻のタイプを変換する必要がある場合があります。ただし、一部の変換は情報の損失につながる可能性があります。たとえば、 DATE 、およびDATETIMEの値はすべて、それぞれ独自の範囲を持ってTIMESTAMPます。 TIMESTAMPは、UTC時間で1970年より前、またはUTC時間「2038-01-1903:14:07」より遅くてはなりません。この規則に基づくと、「1968-01-01」は有効な日付値DATEまたはDATETIMEですが、 TIMESTAMPに変換されると0になります。

DATEの変換:

  • DATEDATETIMEまたはTIMESTAMPに変換されると、DATEには時間情報が含まれないため、時間部分「00:00:00」が追加されます。
  • DATETIMEに変換すると、結果は「00:00:00」になります。

DATETIMEまたはTIMESTAMPの変換:

  • DATETIMEまたはTIMESTAMPDATEに変換されると、時間と小数部分は破棄されます。たとえば、「1999-12-31 23:59:59.499」は「1999-12-31」に変換されます
  • DATETIMEまたはTIMESTAMPがTIMEに変換されると、 TIMEには日付情報が含まれないため、日付部分は破棄されます。

TIMEを他の時刻と日付の形式に変換すると、日付部分は自動的にCURRENT_DATE()として指定されます。最終的に変換された結果は、 TIMECURRENT_DATE()で構成される日付です。つまり、TIMEの値が「00:00:00」から「23:59:59」の範囲を超えている場合、変換された日付部分は現在の日付を示しません。

TIMEDATEに変換すると、プロセスは同様になり、時間部分は破棄されます。

CAST()関数を使用すると、値をDATE型に明示的に変換できます。例えば:

date_col = CAST(datetime_col AS DATE)

TIMEDATETIMEを数値形式に変換します。例えば:

mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;
+-----------|-------------|--------------+
| CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
+-----------|-------------|--------------+
| 09:28:00  |       92800 |    92800.887 |
+-----------|-------------|--------------+
mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
+---------------------|----------------|--------------------+
| NOW()               | NOW()+0        | NOW(3)+0           |
+---------------------|----------------|--------------------+
| 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
+---------------------|----------------|--------------------+

日付に含まれる2桁の年の部分

日付に含まれる2桁の年の部分は、実際の年を明示的に示すものではなく、あいまいです。

DATETIME 、およびDATEタイプの場合、 TIMESTAMPは次のルールに従って、あいまいさを排除します。

  • 01から69までの値は、2001から2069までの値に変換されます
  • 70〜99の値は、1970〜1999の値に変換されます

これらのルールは、1つの例外を除いて、 YEARつのタイプにも適用されます。

数字の00YEAR(4)に挿入すると、結果は2000ではなく0000になります。

結果を2000にする場合は、値を2000に指定します。

MIN()MAX()などの一部の関数では、2桁の年の部分が正しく計算されない場合があります。これらの関数の場合、4桁のフォーマットスイートの方が適しています。