MySQL系列之数据类型(Date&Time)

导览

  • 前言
  • 一、日期/时间类型
      1. Date
      • 1.1 取值范围
      • 1.2 显示格式
      1. Datetime
      • 2.1 取值范围
      • 2.2 显示格式
      1. Timestamp
      • 3.1 取值范围
      • 3.2 显示格式
      1. time
      • 4.1 取值范围
      • 4.2 显示格式
      1. year
      • 5.1 取值范围
      • 5.2 显示格式
  • 二、自动填充机制
      1. 原理介绍
      1. 实现方式
      • 2.1 案例1
      • 2.2 案例2
      • 2.3 案例3
      • 2.4 案例4
      • 2.5 案例5
  • 结语
  • 精彩回放

前言

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

一、日期/时间类型

MySQL时间类型包括Date、Datetime、Timestamp、time、year。

1. Date

日期(不含时分秒

1.1 取值范围

1000-01-01 ~ 9999-12-31

1.2 显示格式

YYYY-MM-DD

2. Datetime

日期(含时分秒

2.1 取值范围

1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999

2.2 显示格式

YYYY-MM-DD hh:mm:ss[.小数位]

提示:小数位长度6,取值0-6。

3. Timestamp

时间戳

3.1 取值范围

'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"。

3.2 显示格式

YYYY-MM-DD hh:mm:ss[.小数位]

提示:小数位长度6,取值0-6。

4. time

时间

4.1 取值范围

-838:59:59.000000~838:59:59.000000

4.2 显示格式

hh:mm:ss[.小数位]

提示:小数位长度6,取值0-6。

5. year

年份

5.1 取值范围

1901~2155或0000

5.2 显示格式

YYYY

二、自动填充机制

1. 原理介绍

MySQL支持对TimestampDatetime类型的字段进行自动填充(默认为当前数据库服务器时间)。那么该如何实现呢?且看下文。

对于表中的任何TimestampDatetime列,你可以将"当前时间(戳)"指定为默认值或者自动更新,对于未指定列值的行,将自动初始化为当前时间(戳)

当行中任何其他列的值发生变化 时,自动更新的(时间(戳))列会更新为当前时间(戳),否则自动更新的列将保持不变。要防止自动更新的列在其他列更改时立即更新,请将其显式设置为当前值 。自动更新的列发生变化时,即使行中的其他列没有更改,也要将其显式设置为它应该具有的值(需设置为CURRENT_TIMESTAMP)。

2. 实现方式

要实现自动更改,需在列定义中使用DEFAULT CURRENT_TIMESTAMP默认当前 )和ON UPDATE CURRENT_TIMESTAMP更新时 )子句。

默认当前时间戳和更新时当前时间戳的使用特定于时间戳和日期时间。DEFAULT子句也可用于指定常量(非自动)默认值(例如,DEFAULT 0或DEFAULT'2000-01-01 00:00:00')。

2.1 案例1

默认为当前时间戳,也会自动更新为最新时间戳。

sql 复制代码
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

2.2 案例2

默认为当前时间戳,不会自动更新为最新时间戳。

sql 复制代码
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP
);

2.3 案例3

默认为一个常量,不会自动更新为最新时间戳。

sql 复制代码
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0,
  dt DATETIME DEFAULT 0
);

2.4 案例4

默认为一个常量,会自动更新为最新时间戳。

sql 复制代码
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);

2.5 案例5

设置默认值,会自动更新为最新时间戳。如Timestamp类型的字段未设置默认值,默认为0,否则以设置为准。

sql 复制代码
CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);

同样,除非使用NOT NULL定义,否则Datetime的默认值为0:

sql 复制代码
CREATE TABLE t1 (
  dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
  dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);

结语

本文对MySQL中的日期/时间类型进行重点说明和介绍,有助于我们在建库建表时,应选择何种类型提供依据或建议。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~


精彩回放


MySQL系列之数据类型(Numeric)
MySQL系列之远程管理(安全)
MySQL系列之身份鉴别(安全)
MySQL系列之数据授权(安全)
MySQL系列之如何在Linux只安装客户端
MySQL系列之如何正确的使用窗口函数(基于8.0版本)
MySQL系列之数据导入导出
MySQL系列之索引入门(上)
MySQL系列之索引入门(下)


相关推荐
广州智造4 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥7 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1239 小时前
Redis解析
数据库·redis·缓存
数据库幼崽9 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd9 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou10 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh10 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵11 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多12 小时前
Linux——mysql主从复制与读写分离
数据库·mysql