# 时间数据类型

__*DATE 数据类型*__

__*TIME 据类型*__

__*DATETIME 据类型*__

__*TIMESTAMP 据类型*__

__*YEAR 据类型*__

+ `DATE`:
  + `'2018-01-04': YYYY-MM-DD`
+ `TIME`:
  + `'12:59:02': HH:MM:SS`
+ `DATETIME` 和 `TIMESTAMP`:
  + `'2018-01-04 12:59:02': YYYY-MM-DD HH:MM:SS`
+ `YEAR`:
  + `1548: YYYY`
+ `TIME, DATETIME` 和 `TIMESTAMP` 接受带有最多 6 位数字的微秒,格式是 `HH:MM:SS[.fraction]`
+ `STRICT_TARNS_TABLE` 和 `STRICT_ALL_TABELS` 这两个 `SQL_MODE`,会影响 TiDB 对日期零值的接受度
  + e.g:  `INSERT INTO test.dropme (day) VALUES ('0000 00-00-00');`
----------------------------------------------------------------
注意,TIMESTAMP 数据类型受 2038 年问题的影响。如果存储的值大于 2038,建议使用 DATETIME 类型。

SQL 严格模式:

```
tidb> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

tidb> insert into test.dropme (day) values ('0000 00-00-00');
Query OK, 1 row affected, 1 warning (0.02 sec)

tidb> set sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)

tidb> insert into test.dropme (day) values ('0000 00-00-00');
ERROR 1292 (22007): Incorrect datetime value: '0000 00-00-00' for column 'day' at row 1
```
- TiDB 支持 MySQL 所有的日期和时间类型,包括 DATE、TIME、DATETIME、TIMESTAMP 以及 YEAR。

- 关于日期和时间值类型,需要注意:
  - 日期部分必须是"年-月-日"的格式（例如 1998-09-04）,而不是"月-日-年"或"日-月-年"的格式。
  - 如果日期的年份部分是 2 位数,TiDB 会根据年份为两位数的具体规则进行转换。
  - 如果格式必须是数值类型,TiDB 会自动将日期或时间值转换为数值类型。

- DATE 类型
  - 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 不仅可用于指示一天内的时间,还可用于指两个事件之间的时间间隔。fsp 参数表示秒精度,取值范围为:0 ~ 6,默认值为 0。
`TIME[(fsp)]`
- 注意:
  - 注意 TIME 的缩写形式。例如,11:12 表示 11:12:00 而不是 00:11:12。但是,1112 表示 00:11:12。这些差异取决于 : 字符的存在与否。

- DATETIME 类型
  - DATETIME 类型是日期和时间的组合,格式为 YYYY-MM-DD HH:MM:SS[.fraction]。支持的范围是 0000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999。fsp 参数表示秒精度,取值范围为 0~6,默认值为 0。TiDB 支持字符串或数字转换为 DATETIME 类型。
`DATETIME[(fsp)]`

- TIMESTAMP 类型
  - TIMESTAMP 类型是日期和时间的组合,支持的范围是 UTC 时间从 1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999。fsp 参数表示秒精度,取值范围为 0~6,默认值为 0。在 TIMESTAMP 中,不允许零出现在月份部分或日期部分,唯一的例外是零值本身 0000-00-00 00:00:00。
`TIMESTAMP[(fsp)]`