前言
在上期文章中,博主介绍了 MySQL 的数据类型 Numeric,今天我们继续探索第二种数据类型:日期或时间。

本文详细介绍了 MySQL 中的五种日期时间类型:Date、Datetime、Timestamp、time 和 year,涵盖各自的取值范围与显示格式。其中 Timestamp 基于 UTC 存储且受时区影响,Datetime 则不受时区限制。此外,文章阐述了利用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 实现字段自动填充的原理与多种代码实现案例,帮助开发者合理选择类型并优化数据存储。

在上期文章中,博主介绍了 MySQL 的数据类型 Numeric,今天我们继续探索第二种数据类型:日期或时间。

MySQL 时间类型包括 Date、Datetime、Timestamp、time、year。
日期(不含时分秒)
1000-01-01 ~ 9999-12-31
YYYY-MM-DD
日期(含时分秒)
1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999
YYYY-MM-DD hh:mm:ss[.小数位]
提示:小数位长度 6,取值 0-6。
时间戳
'1970-01-01 00:00:01.000000' UTC~'2038-01-19 03:14:07.499999' UTC.
提示:Timestamp 值存储为自'1970-01-01 00:00:00'UTC 以来的秒数。Timestamp 不能表示值'1970-01-01 00:00:00',因为这相当于从 1970-01-01 00:00:00 算起的 0 秒。如果表示 0 值,可输入'0000-00-00 00:00:00'。
YYYY-MM-DD hh:mm:ss[.小数位]
提示:小数位长度 6,取值 0-6。
时间
-838:59:59.000000~838:59:59.000000
hh:mm:ss[.小数位]
提示:小数位长度 6,取值 0-6。
年份
1901~2155 或 0000
YYYY
MySQL 支持对 Timestamp 和 Datetime 类型的字段进行自动填充(默认为当前数据库服务器时间)。那么该如何实现呢?且看下文。
对于表中的任何 Timestamp 或 Datetime 列,你可以将'当前时间(戳)'指定为默认值或者自动更新,对于未指定列值的行,将自动初始化为当前时间(戳)。
当行中任何其他列的值发生变化时,自动更新的(时间(戳))列会更新为当前时间(戳),否则自动更新的列将保持不变。要防止自动更新的列在其他列更改时立即更新,请将其显式设置为当前值。自动更新的列发生变化时,即使行中的其他列没有更改,也要将其显式设置为它应该具有的值(需设置为 CURRENT_TIMESTAMP)。
要实现自动更改,需在列定义中使用 DEFAULT CURRENT_TIMESTAMP(默认当前)和 ON UPDATE CURRENT_TIMESTAMP(更新时)子句。 默认当前时间戳和更新时当前时间戳的使用特定于时间戳和日期时间。DEFAULT 子句也可用于指定常量(非自动)默认值(例如,DEFAULT 0 或 DEFAULT'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);
默认为当前时间戳,不会自动更新为最新时间戳。
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP);
默认为一个常量,不会自动更新为最新时间戳。
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0, dt DATETIME DEFAULT 0);
默认为一个常量,会自动更新为最新时间戳。
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP);
设置默认值,会自动更新为最新时间戳。如 Timestamp 类型的字段未设置默认值,默认为 0,否则以设置为准。
CREATE TABLE t1 ( ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-- default 0 ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP-- default NULL);
同样,除非使用 NOT NULL 定义,否则 Datetime 的默认值为 0:
CREATE TABLE t1 ( dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,-- default NULL dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP-- default 0);
本文对 MySQL 中的日期/时间类型进行重点说明和介绍,有助于我们在建库建表时,应选择何种类型提供依据或建议。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online