Mysql timestamp和datetime区别
文章目录
- 一、存储范围和精度
- 二、默认值和自动更新
- 三、时区处理
- 四、索引和性能
- 五、存储空间和数据复制
- 六、使用场景和注意事项
- 七、时区转换
MySQL是一个常用的关系型数据库管理系统,其内置了多种数据类型用于存储和操作数据。其中,timestamp和datetime是两种常用的日期和时间类型,在实际应用中经常被使用。本文将从不同的角度分析二者的区别,并结合案例和代码进行比较说明。
一、存储范围和精度
- datetime:存储范围为’1000-01-01 00:00:00’到’9999-12-31 23:59:59’,默认精度为秒。
- timestamp:存储范围为’1970-01-01 00:00:01’到’2038-01-19 03:14:07’,默认精度为秒。
可以看出,datetime的存储范围和精度更大,能够表示更远的时间。
MySQL的timestamp类型的精确度是秒级。如果需要更高的精确度(比如毫秒或微秒),则需要使用datetime类型。datetime(3) 提供了毫秒级的精确度,而datetime(6) 提供了微秒级的精确度。
如果你在创建表时需要包含MySQL时间戳字段,并希望它具有毫秒级的精确度,你应该这样做:
CREATE TABLE example_table (id INT AUTO_INCREMENT PRIMARY KEY,description VARCHAR(255),created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3)
);
在这个例子中,created_at
字段定义为DATETIME(3)
类型,这意味着它将存储毫秒级精度的时间戳。DEFAULT CURRENT_TIMESTAMP(3)
设置了该字段的默认值为当前时间(包含毫秒精度)。
如果你需要微秒级精确度,你只需将3
改为6
:
CREATE TABLE example_table (id INT AUTO_INCREMENT PRIMARY KEY,description VARCHAR(255),created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)
);
在这个示例中,created_at
字段将存储微秒级精度的时间戳。
二、默认值和自动更新
-
默认值:
- datetime:可以指定默认值,例如’2022-01-01 00:00:00’。
- timestamp:如果未显式指定默认值或插入相应列时,将自动设置为当前时间。
-
自动更新:
- datetime:不支持自动更新,需要手动更新。
- timestamp:支持自动更新,可通过触发器或ON UPDATE CURRENT_TIMESTAMP选项实现。
例如,创建一张用户表,包含注册时间(datetime类型)和最后更新时间(timestamp类型)两个字段:
CREATE TABLE user (registration_time datetime DEFAULT '2022-01-01 00:00:00',last_update_time timestamp ON UPDATE CURRENT_TIMESTAMP
);
在插入用户数据时,可以看到注册时间是固定的,而最后更新时间会自动更新。
三、时区处理
- datetime:不存储时区信息,插入的时间值会被当做服务器的本地时间存储。
- timestamp:存储的是UTC时间,并在检索时会根据系统时间和时区设置转换成本地时间。
例如,设置MySQL服务器时区为UTC+8,插入当前时间:
INSERT INTO user (registration_time, last_update_time) VALUES (NOW(), NOW());
存储在datetime类型的字段中的时间会直接是服务器的本地时间;而存储在timestamp类型的字段中的时间会转换成UTC时间,并加上8个小时。
四、索引和性能
- datetime:在使用datetime作为索引列时,MySQL会对整个日期时间值进行索引,因此可以精确匹配。
- timestamp:在使用timestamp作为索引列时,MySQL只对其中的日期进行索引,忽略时间部分,因此只能匹配到日期相同的记录。
例如,创建一个用户订单表,包含订单时间(datetime类型)和支付时间(timestamp类型)两个字段,同时为这两个字段创建索引:
CREATE TABLE orders (order_time datetime,payment_time timestamp
);CREATE INDEX idx_order_time ON orders (order_time);
CREATE INDEX idx_payment_date ON orders (DATE(payment_time));
在此例中,通过查询订单时间可以使用datetime类型的索引,进行精确匹配;而通过支付时间只能使用日期部分进行索引匹配,忽略具体的时间,降低了查询的精确性。
五、存储空间和数据复制
-
存储空间:
- TIMESTAMP类型使用4个字节的存储空间,存储范围为’1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC。
- DATETIME类型使用8个字节的存储空间,存储范围为’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。
-
数据复制:
- TIMESTAMP值在数据传输过程中(如复制数据、远程备份等)会自动转换为UTC时间(全球标准时间),在目标系统上根据其时区设置转换为当地时间。这意味着,如果源系统和目标系统的时区设置不同,TIMESTAMP字段的值可能会发生变化。
- DATETIME值在数据传输过程中保持不变,不考虑时区设置。这意味着,无论源系统和目标系统的时区设置如何,DATETIME字段的值都保持一致。
这些差异使得TIMESTAMP和DATETIME在不同的应用场景中各有优势。例如,如果希望在世界范围内统一处理时间(如在分布式系统中),可能会选择TIMESTAMP;如果希望保存历史事件的确切日期和时间,可能会选择DATETIME。
六、使用场景和注意事项
使用场景:
- TIMESTAMP通常用于记录特定事件发生的具体时间,如用户注册时间,用户登陆时间等。
- DATETIME通常用于记录未来的日期时间,或者需要保存年份比较大或者比较小的时间。
注意事项:
- 使用TIMESTAMP时要注意它的时间范围,避免超出。
- 基于TIMESTAMP的时区转换特性,如果你的应用运行在多个时区,而你又希望所有用户在查看同一时间字段时看到一样的值,那么应该使用DATETIME。
- 为了获取准确的结果,最好在应用程序中处理日期和时间的运算,而不是依赖于SQL。
-- 创建一个名为example的数据库
CREATE DATABASE example;
USE example;-- 创建一个名为timetable的表,包含一个TIMESTAMP和一个DATETIME列
CREATE TABLE timetable (event_timestamp TIMESTAMP,event_datetime DATETIME
);-- 插入一条记录,使用当前时间作为值
INSERT INTO timetable (event_timestamp, event_datetime) VALUES (CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP());-- 查询记录,观察输出结果
SELECT * FROM timetable;
这个例子演示了使用TIMESTAMP和DATETIME插入和查询数据。在插入一条记录时,TIMESTAMP和DATETIME列都使用了CURRENT_TIMESTAMP()
函数来获取当前的时间。然后,通过查询SELECT * FROM timetable;
来获取这条记录的所有列。
TIMESTAMP列在查询结果中可能显示的时间与插入时不完全相同,这是因为TIMESTAMP在存储时被转换为了当前时区的时间。换句话说,查询结果是当前时区的时间版本。而DATETIME列则会原样输出插入时的时间值,不受时区影响。
这个示例可以帮助您更好地理解TIMESTAMP和DATETIME在实际使用中的区别和行为差异。
七、时区转换
一个重要的区别在于时区处理。在应用中,我们经常需要处理不同时区的日期和时间,而timestamp和datetime在时区转换方面表现不同。
-
datetime:datetime类型的值没有时区信息,它被视为服务器本地时间。如果我们在一个具有时区差异的环境中使用datetime值,可能会导致时区处理不准确。
-
timestamp:timestamp类型存储的是UTC时间,但当我们从数据库中检索数据时,它会自动根据系统时区和连接会话时区进行转换成本地时间。
下面通过一个例子来说明这一点。假设有一个应用需要记录用户的登录时间,它支持国际化,用户分布在不同的时区。我们使用timestamp和datetime来存储登录时间。
CREATE TABLE user_login (user_id INT,login_time_datetime DATETIME,login_time_timestamp TIMESTAMP
);
- 使用datetime存储登录时间:
INSERT INTO user_login (user_id, login_time_datetime) VALUES (1, '2022-03-13 13:30:00');
当用户登录的时候,我们获取用户所在时区,并将登录时间转换为该时区的本地时间。
import pytz
from datetime import datetimeuser_timezone = pytz.timezone('Asia/Shanghai')
login_time = datetime(2022, 3, 13, 13, 30, 0, tzinfo=pytz.utc).astimezone(user_timezone)print(login_time)
在这个例子中,我们假设用户位于上海时区(Asia/Shanghai),将UTC时间转换为用户本地时间。但是,如果我们从数据库中检索登录时间并显示给用户时,可能会出现问题,因为登录时间没有时区信息,可能会被错误地解释为用户本地时间。
- 使用timestamp存储登录时间:
INSERT INTO user_login (user_id, login_time_timestamp) VALUES (1, '2022-03-13 13:30:00');
当用户登录的时候,我们直接将UTC时间存储在timestamp类型的字段中,不需要进行时区转换。
import pytz
from datetime import datetimeuser_timezone = pytz.timezone('Asia/Shanghai')
login_time = datetime(2022, 3, 13, 13, 30, 0, tzinfo=pytz.utc)print(login_time)
在这个例子中,我们同样假设用户位于上海时区,但是由于timestamp类型存储的是UTC时间,不需要进行时区转换。当我们从数据库中检索登录时间时,它会自动根据用户所在时区进行转换,并返回正确的登录时间。
通过这个例子,我们可以看到timestamp类型在处理时区转换方面的优势。在设计应用中涉及到跨时区的日期和时间存储时,timestamp类型是更可取的选择。
相关文章:
Mysql timestamp和datetime区别
文章目录 一、存储范围和精度二、默认值和自动更新三、时区处理四、索引和性能五、存储空间和数据复制六、使用场景和注意事项七、时区转换 MySQL是一个常用的关系型数据库管理系统,其内置了多种数据类型用于存储和操作数据。其中,timestamp和datetime是…...

新手村之SQL——分组与子查询
1.GROUP BY GROUP BY 函数就是 SQL 中用来实现分组的函数,其用于结合聚合函数,能根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 mysql> SELECT country, COUNT(country) AS teacher_count-> FROM teacher…...

【hacker送书第9期】算法训练营(入门篇)
第9期图书推荐 内容简介作者简介精彩书评图书目录概述参与方式 内容简介 本书以海量图解的形式,详细讲解常用的数据结构与算法,又融入大量的竞赛实例和解题技巧。通过对本书的学习,读者可掌握12种初级数据结构、15种常用STL函数、10种二叉树和…...

微服务链路追踪组件SkyWalking实战
概述 微服务调用存在的问题 串联调用链路,快速定位问题;理清服务之间的依赖关系;微服务接口性能分析;业务流程调用处理顺序; 全链路追踪:对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…...
ubuntu 更换国内镜像
备份 cd /etc/aptcp sources.list sources.list.bakup修改源为清华源 sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g sources.list更新软件源 apt-get update其他源如下: mirrors.ustc.edu.cn 中科大 mirrors.163.com 163 mirrors.aliyun.com 阿里云...
树模型与深度模型对比
表格型数据为什么那么神奇,能让树模型在各种真实场景的表格数据中都战胜深度学习呢?作者认为有以下三种可能: 神经网络倾向于得到过于平滑的解冗余无信息的特征更容易影响神经网络 所以一定程度的特征交叉是不是必要的,因为one-ho…...
测试类运行失败:TestEngine with ID ‘junit-jupiter‘ failed to discover tests
背景:原本我的项目是可以运行的,然后我用另外一台电脑拉了下来,也是可以用的,但是很奇怪,用着用着就不能用了。报了以下错误: /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home/bin/java …...
nodejs使用node-cron实现定时任务功能
ChatGPT国内站点:海鲸AI 在Node.js中,node-cron是一个轻量级的任务调度库,它允许你根据类似于Cron的时间表来安排任务的执行。如果你想要每十分钟执行一次任务,你可以按照以下步骤来设置: 安装node-cron: 如…...
【1day】蓝凌OA 系统datajson.js接口远程命令执行漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现...

ABCDE类网络的划分及保留网段
根据IP地址的分类,IP地址被分为A、B、C、D和E五类。下面是对ABCDE类网络的划分及保留网段的详细描述: A类网络:范围从1.0.0.0到127.0.0.0,网络地址的最高位必须是“0”,可用的A类网络有127个,每个网络能容…...
营销系统规则引擎
一、系统介绍 规则引擎是一个用于执行营销规则的模块,其包括营销规则配置、规则校验等功能。规则引擎可以根据预先设定的条件和逻辑,自动化地执行特点的营销策略,帮助企业更好地吸引客户,增加销售和提高客户满意度。 规则引擎功能…...

【Linux】命令行参数
文章目录 前言一、C语言main函数的参数二、环境变量总结 前言 我们在Linux命令行输入命令的时候,一般都会跟上一些参数选项,比如l命令,ls -a -l。以前我总是觉得这是理所当然的,没深究其本质究竟是什么,今天才终于知道…...

【信息安全】-个人敏感信息、个人信息、个人金融信息
文章目录 个人敏感信息个人敏感信息判定举例 个人信息个人信息判定举例 个人金融信息内容a) 账户信息指账户及账户相关信息b) 鉴别信息c) 金融交易信息d) 个人身份信息e) 财产信息f) 借贷信息g) 其他信息: 出处 个人敏感信息 个人敏感信息判定 个人敏感信息是指一旦泄露、非法…...

海外服务器和国内服务器有什么样的区别呢
海外服务器和国内服务器有什么样的区别呢,其实呢在外形方面是大同小异,除了外形还有一些其他方面还存在这一些差异。 一,地理位置的差异。 海外服务器——有可能在中国数据中心之外的任何国家地区,例如美国服务器,韩…...

电脑屏幕亮度怎么调?学会4个方法,轻松调节亮度!
“我总是感觉我电脑屏幕太暗了,有时候如果光线好一点,会看不清电脑屏幕。有什么可以把电脑调亮一点的简单方法吗?” 在我们的日常生活中,电脑已经成为我们工作、学习、娱乐不可或缺的工具。然而,长时间面对电脑屏幕可能…...

微信小程序之猜数字和猜拳小游戏
目录 效果图 app.json 一、首页(index3)的代码 wxml代码 wxss代码 二、猜数字页面(index)代码 wxml代码 wxss代码 js代码 三.游戏规则页面(logs)代码 wxml代码 wxss代码 四.猜拳页面ÿ…...

CETN01 - How to Use Cloud Classroom
文章目录 I. Introduction to Cloud ClassroomII. How to Use Cloud Classroom1. Publish Resources2. Conduct Activities3. Class Teaching Reports4. View Experience Values5. Performance in Cloud Classroom I. 云课堂介绍II. 如何使用云课堂1. 发布资源2. 进行活动3. 班…...
安卓8预装可卸载应用
环境 系统:Android 8 CPU:MTK 理论上改法适用于其他平台,比如展讯。 不适用于安卓11。安卓11请参照android 11预装APP到data/app目录 实现 假设要内置test这个应用。 第一步把test添加到系统编译配置中,不同平台或cpu文件不一样。 比如&am…...

微服务实战系列之MemCache
前言 书接前文,马不停蹄,博主继续书写Cache的传奇和精彩。 Redis主要用于数据的分布式缓存,通过设置缓存集群,实现数据的快速响应,同时也解决了缓存一致性的困扰。 EhCache主要用于数据的本地缓存,因无法保…...

解决服务端渲染程序SSR运行时报错: ReferenceError: document is not defined
现象: 原因: 该错误表明在服务端渲染 (SSR) 过程中,有一些代码尝试在没有浏览器环境的情况下执行与浏览器相关的操作。这在服务端渲染期间是一个常见的问题,因为在服务端渲染期间是没有浏览器 API。 解决办法: 1. 修…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...