MySQL时间字段TIMESTAMP和DATETIME

SELECT @@global.time_zone, @@session.time_zone;

查询数据库的全局时区和当前会话的时区信息,一般如果使用navicat进行连接,没有显示指定时区信息,会默认使用system_time_zone。
可以使用

SET time_zone = '+08:00';
SELECT @@global.time_zone, @@session.time_zone;

设置当前会话的时区信息。

总结就是TIMESTAMP会根据会话连接的时区信息进行变化,也就是如果会话信息是东八区就变成东八区,如果是UTC+2就是UTC+2。而DATETIME是不会变化的。如下图
在这里插入图片描述
在这里插入图片描述
现在把当前会话的时区信息设置为东六区,SET time_zone = ‘+06:00’;再次查询如下
在这里插入图片描述
可以明显看到TIMESTAMP是在进行改变的,而DATETIME始终保持不变。如果业务是在跨时区的地方,尤其是有冬令时切换的地方,TIMESTAMP会自动变化,而DATETIME不会变化,前提是使用系统时区。

这样的话,问题来了,数据库使用的是默认时区,因为历史原因无法改变,只能代码手动指定时区,防止时区切换了。

前端的组件一般可以根据客户端的时间来自动展示,例如Moment.js 和 Day.js,这两个区别功能上差不多,只是包的大小不一样,dayjs可能更常用于H5手机端。那么后端传给前端的参数可以是Long的时间戳或者ISO 8601 格式的字符串,注意是ISO 8601 ,不要和ISO 8859-1搞混,ISO 8601 是2004-05-03T17:30:08+08:00或者是2021-11-30T12:00:00Z,ISO 8859-1一般指的是编码。

在实际开发中,ISO 8601 格式通常是更推荐的方式,因为它便于展示,且默认包含时区信息,减少了时区相关的错误处理。

### MySQL 中 `TIMESTAMP` 与 `DATETIME` 类型的时区差异及使用场景 #### 1. **时区处理上的区别** - 在 MySQL 中,`TIMESTAMP` 数据类型是以 UTC(协调世界时)形式存储的时间戳。当写入或读取数据时,MySQL 自动将时间从客户端所在的时区转换为 UTC 存储,并在检索时将其从 UTC 转换回客户端所在时区[^3]。 - 相反,`DATETIME` 不涉及任何时区转换操作。它仅作为一个固定的时间值被存储检索,与时区无关[^2]。 #### 2. **存储方式的不同** - `TIMESTAMP` 占用的空间较小,只有 4 字节,而 `DATETIME` 需要 8 字节来存储完整的日期时间信息。 #### 3. **适用场景分析** - 如果应用程序需要跨多个时区工作,则应优先考虑使用 `TIMESTAMP`,因为它能够自动处理不同用户的本地化需求并保持一致性。 - 对于那些不需要考虑时区变化的应用程序或者希望明确控制所有时间日期表示的情况来说,`DATETIME` 是更合适的选择[^1]。 #### 4. **有效范围对比** - `TIMESTAMP` 支持的有效时间为 '1970-01-01 00:00:01' 至 '2038-01-19 03:14:07'^[3]^ ,这意味着对于超出此时间段的需求无法满足。 - `DATETIME` 提供了一个更大的覆盖区间——‘1000-01-01’ 到 ‘9999-12-31’^[3]^ ——因此更适合长期历史记录或其他远期预测用途。 #### 5. **精度选项** 值得注意的是,除了基本类型的定义之外,还可以通过指定额外参数如 `(n)` 来增加某些数值列的小数位数长度;例如 `DATETIME(6)` 表示支持直到微秒级别的准确性,这取决于具体业务逻辑的要求以及硬件性能限制等因素决定采用何种程度上细化表达时刻的能力^[2]^。 ```sql -- 创建表的例子展示如何设置不同的时间字段 CREATE TABLE example_table ( id INT PRIMARY KEY AUTO_INCREMENT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自动生成创建/更新时间', event_time DATETIME(6) NOT NULL COMMENT '事件发生的具体瞬间' ); ``` 上述 SQL 片段展示了如何利用这两种不同类型的数据结构设计数据库模式以适应实际应用场景中的各种情况下的最佳实践方法之一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值