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日

相关文章

  • 从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例

    针对这个题目,我将分成以下几个部分进行讲解: 文章介绍 环境搭建 代码编写 示例说明 文章介绍 本文是从零开始学习Node.js系列教程的第四部分,主要探讨如何在client端和server端实现数学运算。本文的主要内容包括: 如何搭建client-server基本架构 如何实现多路径的路由 如何在client端和server端实现数学运算 环境搭建 在进行…

    database 2023年5月21日
    00
  • C#操作redis代码汇总

    马上要用redis来改造现有的o2o项目了,在linux下部署了个redis,顺便研究了下代码操作,分享下代码 using System; using System.Collections.Generic; using ServiceStack.Redis; namespace SysBuild { class Program { //linux服务器地址 …

    Redis 2023年4月13日
    00
  • php日期转时间戳,指定日期转换成时间戳

    要将日期转换为时间戳,可以使用PHP中的strtotime()函数。 该函数将日期时间字符串转换为指定格式的Unix时间戳。以下是使用该函数将日期转换为时间戳的步骤: 步骤一:使用strtotime()函数将指定日期时间字符串转换为Unix时间戳。 步骤二:在获取到时间戳后,存储该值,以备以后使用。 下面我们分别来演示一下两个案例。 案例一:将当前日期时间转…

    database 2023年5月22日
    00
  • MySQL常用运算符概述

    在MySQL中,常用的运算符包括: 算术运算符:用于数值计算 加法:+ 减法:- 乘法:* 除法:/ 取模:% 示例: SELECT 10 + 5; #输出15 SELECT 10 – 5; #输出5 SELECT 10 * 5; #输出50 SELECT 10 / 5; #输出2 SELECT 10 % 5; #输出0 比较运算符:用于对数值、字符串等进行…

    MySQL 2023年3月9日
    00
  • spring boot 整合redis之后报错

    spring boot2 整合redis,使用下述依赖 implementation ‘org.springframework.boot:spring-boot-starter-data-redis’ 但是在项目启动的时候,就会报错, Caused by: java.lang.ClassNotFoundException: org.apache.common…

    Redis 2023年4月12日
    00
  • SQL Server 服务由于登录失败而无法启动

    当 SQL Server 服务无法启动并提示“登录失败”时,通常是由于以下原因之一: SQL Server 服务的登录凭据无效或已更改; SQL Server 服务使用的账户没有足够的权限。 为了解决这个问题,我们可以按照以下步骤进行: 检查 SQL Server 服务登录凭据是否有效:打开服务管理器,找到 MSSQLSERVER 服务(或其他 SQL Se…

    database 2023年5月21日
    00
  • MongoDB中的参数限制与阀值详析

    MongoDB中的参数限制与阀值详析 简介 在使用MongoDB数据库时,我们需要了解一些参数限制与阀值的概念,以便在使用数据库时更高效,更稳定地管理和操作数据。本文将对MongoDB中的参数限制与阀值进行详细的讲解,并提供两个实例作为参考。 参数限制 MongoDB中有一些可以进行配置的参数,这些参数的正确设置可以提高数据库的性能。下面是MongoDB中的…

    database 2023年5月22日
    00
  • DBMS 三层架构

    DBMS三层架构是指数据库管理系统的架构被分成了三层,分别是外层用户视图层、中间逻辑层和内层数据层,通常被称为三层架构设计。这种设计将数据库应用程序的逻辑和数据分离开来,使得各个层次之间解耦,降低了应用程序的维护成本,同时提高了可扩展性。 下面我将详细讲解DBMS三层架构的攻略及实例说明。 外层用户视图层 外层用户视图层是面向用户的,为用户提供方便直观的操作…

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