MySQL之DATETIME与TIMESTAMP的时间精度问题

MySQL之DATETIME与TIMESTAMP的时间精度问题

简介

MySQL 中有两种用于存储日期时间的数据类型:DATETIMETIMESTAMP。它们在精确度和存储方式上有所不同。

本文将详细讲解这两种数据类型的不同之处,并通过示例说明一些注意事项,帮助您更好地理解它们。

DATETIME

DATETIME 数据类型存储日期和时间数据,精度为秒,范围为 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。

在 MySQL 中,DATETIME 的格式为 YYYY-MM-DD HH:MM:SS,其中 YYYY 表示四位数的年份,MM 表示两位数的月份,DD 表示两位数的日期,HH 表示小时,MM 表示分钟,SS 表示秒。例如:“2022-09-09 15:08:22”。

TIMESTAMP

TIMESTAMP 数据类型也用于存储日期和时间数据,但是它的精度比 DATETIME 更高,可以精确到微秒级别。另外,TIMESTAMP 数据类型可以自动将记录的创建时间和更新时间记录在列中。

在 MySQL 中,TIMESTAMP 格式为 YYYY-MM-DD HH:MM:SS[.fraction],其中的 [.fraction] 部分表示微秒。例如:“2022-09-09 15:08:22.123456”。

需要注意的是,TIMESTAMP 数据类型只能表示从1970年1月1日00:00:01到2038年1月9日03:14:07期间的时间。

区别与注意事项

以下是 DATETIMETIMESTAMP 的区别与注意事项:

存储方式不同

DATETIME 类型将日期和时间的值存储为从 '1000-01-01 00:00:00' 到当前日期和时间的秒数。

TIMESTAMP 类型使用自1970年1月1日00:00:01(UTC)以来的秒数来表示日期和时间值。

存储空间和效率

DATETIME 数据类型占用8个字节,而 TIMESTAMP 仅占用4个字节。因为 DATETIME 能够存储更大的时间范围和更高的精度。

相应地,TIMESTAMP 数据类型通常更具有效性,因为它需要较少的磁盘空间,且在查询时比 DATETIME 快。

时间范围不同

DATETIME 的时间范围为 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。

TIMESTAMP 的时间范围为从1970年1月1日00:00:01到2038年1月9日03:14:07期间的时间。

因此,在需要存储遥远的历史数据或者需要存储将来的日期时,最好使用 DATETIME

时区不同

在 MySQL 中,DATETIME 类型的时间值没有时区的概念,可以认为它的时间是本地时间。而 TIMESTAMP 类型存储的时间值始终基于 UTC。

自动更新

DATETIME 不同,TIMESTAMP 列通常具有自动更新属性。如果创建或更新行时未提供 TIMESTAMP 等效列的值,则会将当前日期和时间插入该列。

示例

示例1:存储精度

对于需要高精度时间的场景,应该使用 TIMESTAMP 数据类型。

在下面的示例中,我们分别创建一个 DATETIME类型和一个TIMESTAMP类型的表,然后将相同的日期时间插入其中,比较它们的存储精度。

CREATE TABLE datetime_table (
  id INT PRIMARY KEY,
  ts DATETIME
);

CREATE TABLE timestamp_table (
  id INT PRIMARY KEY,
  ts TIMESTAMP
);

INSERT INTO datetime_table (id, ts) VALUES (1, '2022-09-09 15:08:22.123456');
INSERT INTO timestamp_table (id, ts) VALUES (1, '2022-09-09 15:08:22.123456');

SELECT * FROM datetime_table;
SELECT * FROM timestamp_table;

运行上述SQL语句后,我们可以看到,DATETIME类型仅保留了秒级别的精度,而TIMESTAMP类型保留了微秒级别的精度。这意味着,在 TIMESTAMP 类型的列中存储数据时,能够更加准确地记录日期和时间。

示例2:自动更新

如果需要记录记录创建时间和最后更新时间,可以使用 TIMESTAMP,因为它支持自动更新。

在下面的示例中,我们创建了一个 users 表,并将更新时间设为 TIMESTAMP 类型。当行被更新时,我们将看到该列自动更新为当前日期和时间。

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50),
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO users (name) VALUES ('Alice');

-- 更新名称后,updated_at字段自动更改
UPDATE users SET name = 'Bob' WHERE id = 1;

SELECT * FROM users;

运行上述SQL语句后,我们可以看到在更新后,updated_at 字段的值将自动更新为当前日期和时间,以便更准确地跟踪数据的修改历史。

结论

在存储日期和时间数据时,应根据实际需求选择数据类型。如果需要更高的存储效率和更广泛的时间范围,请使用 DATETIME。如果需要更高的时间精度和自动更新功能,请使用 TIMESTAMP

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL之DATETIME与TIMESTAMP的时间精度问题 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • PHP实现多条件查询实例代码

    下面是详细讲解“PHP实现多条件查询实例代码”的完整攻略: 1. 准备工作 在开始编写代码之前,需要先梳理一下查询的需求,并设计好数据库结构。例如,我们要查询一些书籍信息,那么可以创建一个名为 books 的数据表,并在其中添加一些字段,如图所示: CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCRE…

    database 2023年5月22日
    00
  • Centos8安装mysql8的详细过程(免安装版/或者二进制包方式安装)

    以下是CentOS 8安装MySQL 8的详细过程。 准备工作 在开始安装之前,需要在CentOS 8上安装一些依赖项以支持MySQL 8。在终端中运行以下命令: sudo dnf install wget curl vim sudo dnf install libaio sudo dnf install numactl 这些命令将安装wget、curl和v…

    database 2023年5月22日
    00
  • MongoDB学习之Text Search文本搜索功能

    MongoDB学习之Text Search文本搜索功能 在 MongoDB 中,Text Search 是针对文本内容进行全文搜索的一种功能,可以用于在文本数据中查找特定的单词或短语。本文将介绍 MongoDB Text Search 的使用方法。 1. 开启 Text Search 在 MongoDB 中开启 Text Search 功能需要使用全文索引,…

    database 2023年5月21日
    00
  • 超详细汇总21个值得收藏的mysql优化实践

    超详细汇总21个值得收藏的MySQL优化实践 在MySQL的使用过程中,优化是非常重要的一个环节。在优化过程中,涉及到的方面包括数据结构、数据库架构、查询语句优化等多个方面。下面将对21个值得收藏的MySQL优化实践进行超详细汇总: 优化架构 1. 数据库服务器的设置 MySQL服务器的设置对于整个数据库的性能有很大的影响。可以进行以下设置优化:- 修改缓存…

    database 2023年5月19日
    00
  • CentOS mysql安装系统方法

    以下是关于CentOS mysql安装系统方法的完整攻略: 准备工作 在开始安装mysql之前,我们需要先安装一些必要的软件依赖,以确保mysql能够正常运行。 $ sudo yum install wget $ sudo yum install curl $ sudo yum install gcc $ sudo yum install gcc-c++ $…

    database 2023年5月22日
    00
  • Mysql中@和@@符号的详细使用指南

    当我们在MySQL中使用特殊字符时,有些符号会有特殊的含义。其中包括@和@@符号,它们在MySQL中有着不同的用法。本攻略详细讲解了这些符号的使用方法。 @符号 在MySQL中,@符号被用来作为用户变量的标志。用户可以定义并使用这些变量,以便在查询中轻松地存储和检索值。可以通过在变量名称前加@符号定义用户变量。 以下是定义变量的示例: SET @name :…

    database 2023年5月18日
    00
  • SQL 中sp_executesql存储过程的使用帮助

    SQL 中sp_executesql存储过程的使用帮助 概述 sp_executesql 是 SQL Server 的一种存储过程,它可以动态执行一段 SQL 语句。相对于直接使用 EXEC 执行动态 SQL 语句,sp_executesql 有以下优点: 可以指定参数,更加安全和有效。 可以预编译 SQL 语句,提供执行效率。 可以避免 SQL 注入攻击。…

    database 2023年5月21日
    00
  • Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案

    下面将详细讲解”Mybatis-plus自动填充不生效或自动填充数据为null原因及解决方案”的攻略。 一、问题描述 当我们在使用Mybatis-plus的自动填充功能时,有时候会遇到自动填充不生效或自动填充数据为null的情况,这时候我们需要找到问题所在并进行解决。 二、原因分析 自动填充不生效或自动填充数据为null的原因通常有以下几种情况: 没有开启自…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部