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

yizhihongxing

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日

相关文章

  • 业务开发和销售的区别

    业务开发和销售的区别 业务开发和销售是企业中两个重要的职能部门,虽然它们都与商品或服务的交易有关系,但它们的角色和职责有着内在的差别。 业务开发 业务开发通常是指企业寻找并与新客户建立联系、发掘新的业务机会,为企业带来持续的利润增长。业务开发的工作聚焦于业务拓展和市场开拓,并直接与顾客进行沟通来确定他们的需求和痛点。 业务开发的主要任务有: 研究市场和行业,…

    database 2023年3月27日
    00
  • sql 中 case when 语法使用方法

    当我们处理SQL查询时,有时候我们需要对数据进行分类和排序。SQL中Case When语法就是为了解决这个问题而存在的。它可以将数据按照我们指定的条件进行分类,并进行相应的处理,还可以在查询语句中进行逻辑控制。下面我将详细讲解Case When语法的使用方法。 基础语法 CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ……

    database 2023年5月21日
    00
  • MySQL数据库定时备份的实现方法

    MySQL数据库定时备份的实现方法 1. 常见的MySQL备份方式 MySQL是常见的数据库系统,备份数据是管理MySQL数据库的一项基本操作。常见的MySQL备份方式有以下几种: 1.1 手动备份 手动备份是通过使用mysql命令行工具执行导出命令将数据库导出的方式进行备份。例如,下面介绍如何使用mysql命令行工具备份test数据库: 打开命令行终端,并…

    database 2023年5月22日
    00
  • 如何保障mysql和redis之间的数据一致性

    在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。 懒加载 读取缓存步骤一般没有什么问题,但是一旦涉及到…

    Redis 2023年4月11日
    00
  • 定时导出mysql本地数据替换远程数据库数据脚本分享

    关于“定时导出mysql本地数据替换远程数据库数据脚本分享”,我可以提供以下攻略: 定时导出mysql本地数据替换远程数据库数据脚本分享 1. 问题背景 在网站开发过程中,可能遇到需要对mysql本地数据进行备份并替换远程数据库数据的需求,例如遇到线上故障而需要回滚数据。 2. 解决方案 我们可以通过编写一个bash脚本,在本地定时执行mysqldump命令…

    database 2023年5月22日
    00
  • 解析如何查看Oracle数据库中某张表的字段个数

    查看Oracle数据库中某张表的字段个数的攻略如下: 步骤一:登录数据库 首先请登录您的 Oracle 数据库,使用管理员权限打开 SQL*Plus 或 SQL Developer 等工具。 步骤二:执行命令行语句 打开 SQL*Plus 或 SQL Developer 工具后,输入以下代码: SELECT COUNT(*) FROM user_tab_co…

    database 2023年5月21日
    00
  • 关于linux redis安装及安装遇到的问题

    下面我将详细讲解关于Linux下Redis安装及安装遇到的问题的完整攻略。 安装 Redis 步骤1:下载Redis 进入Redis的官方网站 https://redis.io/download ,选择最新版本下载。 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 步骤2:解压Redis 解…

    database 2023年5月22日
    00
  • SQL 返回非分组列

    SQL中的分组(Group by)用于将相同值的行组合成一个汇总行,通常会结合聚合函数(如COUNT, SUM, AVG等)来计算分组后的结果。分组操作需要指定一个或多个分组列,而所有非分组列则需要使用聚合函数进行处理。但有时候我们需要返回非分组列的原始值,该如何实现呢? 在SQL中,我们可以通过以下方法来返回非分组列的原始值: 1.使用子查询或视图 使用子…

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