> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/ji-chu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/ji-chu/mysql/sql-you-hua/schema-she-ji/xuan-ze-shu-ju-lei-xing/ri-qi-lei-xing.md).

# 日期类型

{% hint style="info" %}
MySQL 可以存储的最小时间粒度是<mark style="color:blue;">**微秒**</mark>。
{% endhint %}

## DATETIME

* 可以保存大范围的数值，**从 1000 年到 9999 年**，精度为 <mark style="color:blue;">**1 微秒**</mark>。
* 以 <mark style="color:blue;">**YYYYMMDD HHMMSS**</mark> 格式存储<mark style="color:blue;">**压缩成整数**</mark>的日期和时间，需要 <mark style="color:blue;">**8 字节**</mark>的存储空间。
* <mark style="color:blue;">**与时区无关**</mark>。
* 默认情况下，MySQL 以**可排序**、无歧义的格式显示 DATETIME 值，例如，2008-01-16 22:37:08。这是 **ANSI** 表示日期和时间的标准方式。

## TIMESTAMP

* TIMESTAMP 类型存储<mark style="color:blue;">**自 1970 年 1 月 1 日格林尼治标准时间（GMT）午夜以来经过的秒数**</mark><mark style="color:blue;">——</mark><mark style="color:blue;">**与 UNIX 时间戳相同**</mark>。
* TIMESTAMP 只使用 <mark style="color:blue;">**4 字节**</mark>的存储空间。
* 范围比 DATETIME 小得多：<mark style="color:blue;">**只能表示从 1970 年到 2038 年 1 月 19 日**</mark>。
* MySQL 提供 <mark style="color:blue;">**FROM\_UNIXTIME()**</mark> 函数来将 UNIX 时间戳转换为日期，并提供了 <mark style="color:blue;">**UNIX\_TIMESTAMP()**</mark> 函数将日期转换为 UNIX 时间戳。
* 时间戳显示的值<mark style="color:blue;">**依赖于时区**</mark>。<mark style="color:orange;">**MySQL 服务器、操作系统和客户端连接都有时区设置。**</mark>
* TIMESTAMP 还有 DATETIME 没有的特殊属性。
  * <mark style="color:blue;">**默认情况下，当插入一行记录时没有指定第一个 TIMESTAMP 列的值，MySQL 会将该列的值设置为当前时间**</mark>。
  * <mark style="color:blue;">**当更新一行记录时没有指定第一个 TIMESTAMP 列的值，MySQL 默认也会将该列的值更新为当前时间**</mark>。
* TIMESTAMP 列在**默认情况下为 NOT NULL**。
