MySQL里面的时间与UNIX时间戳,解决2038年问题的思考

news/2025/1/20 11:47:24/文章来源:https://www.cnblogs.com/xiongzaiqiren/p/18681019

当前时间:NOW()

当前时间:NOW()函数,传入参数是一个整数类型,传入参数可以是:空(0)、1~6;代表时间精度(秒后面的精度)。
SELECT NOW(), NOW(0), NOW(1), NOW(2), NOW(3), NOW(4), NOW(5), NOW(6); 如下:

NOW() NOW(0) NOW(1) NOW(2)
2025-01-20 09:47:01 2025-01-20 09:47:01 2025-01-20 09:47:01.4 2025-01-20 09:47:01.40
second(s) second(s) decisecond(ds) centisesond(cs)

 

NOW(3) NOW(4) NOW(5) NOW(6)
2025-01-20 09:47:01.405 2025-01-20 09:47:01.4052 2025-01-20 09:47:01.40525 2025-01-20 09:47:01.405254
millisecond(ms) - - microsecond(μs)

传入参数最大值是6,如果大于6会报错,错误代码: 1426

1 queries executed, 0 success, 1 errors, 0 warnings查询:SELECT NOW(7)错误代码: 1426
Too-big precision 7 specified for 'now'. Maximum is 6.执行耗时   : 0 sec
传送时间   : 0 sec
总耗时      : 0.008 sec

常用的当前时间有3种:

  • NOW() 精确到秒的日期时间
  • NOW(3) 精确到毫秒(千分之一秒)的日期时间
  • NOW(6) 精确到微秒(千分之一毫秒,10的6次方分之一秒)的日期时间

UNIX时间戳

首先要知道当初UNIX时间戳是UNIX系统内核在里面使用的,因为其简单高效的特点逐渐被广泛使用。

unix时间戳:从1970年1月1日开始所经过的秒数。

Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
Unix 时间戳(英文为 Unix epoch, Unix time, POSIX time 或 Unix timestamp)
UNIX时间戳的 0 按照 ISO 8601 规范为 :1970-01-01T00:00:00Z.
注意:UNIX时间戳是包含时区的。咱们中国是“东八区”要在时间原点基础上+8小时。所以咱们中国地区的UNIX时间戳是从1970年1月1日 08:00:00开始所经过的秒数。

一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。

时间
1 分钟 60
1 小时 3600
1 天 86400
1 周 604800
1 月 (30.44 天) 2629743
1年 (365.24 天) 31556736
2038年问题

在大多数的 Unix 系统中 Unix 时间戳存储为 32 位,这样会引发 2038 年问题或 Y2038。

MySQL内置函数 UNIX_TIMESTAMP() 与 FROM_UNIXTIME()
  • UNIX_TIMESTAMP(日期时间格式) 用于将 日期时间格式 的参数转换为 UNIX时间戳。
  • FROM_UNIXTIME(UNIX时间戳) 用于将 UNIX时间戳 转换为 日期时间格式。

秒级时间戳:

UNIX_TIMESTAMP('2025-01-20 09:23:51') UNIX_TIMESTAMP(NOW()) (UNIX_TIMESTAMP(NOW())* 1000)
1737336231 1737336231 1737336231000
FROM_UNIXTIME(1737336231) <- 同左边 FROM_UNIXTIME(1737336231000 / 1000)
2025-01-20 09:23:51 <- 同左边 2025-01-20 09:23:51.0000

毫秒级时间戳:

(UNIX_TIMESTAMP(NOW(3))* 1000) (UNIX_TIMESTAMP(NOW(6))* 1000000)
1737340830990.000 1737341362745981.000000
FROM_UNIXTIME(1737340830990 / 1000) FROM_UNIXTIME(1737341362745981 / 1000000)
2025-01-20 10:40:30.9900 2025-01-20 10:49:22.7459
FROM_UNIXTIME(1737340830990.000 / 1000) FROM_UNIXTIME(1737341362745981.000000 / 1000000)
2025-01-20 10:40:30.990000 2025-01-20 10:49:22.745981
使用MySQL的BIGINT类型存储毫秒级时间戳

在很多应用中,我们需要存储时间戳来记录事件发生的时间。通常情况下,我们使用int整数类型来存储时间戳,比如UNIX时间戳。但是,在某些应用场景中,需要存储毫秒级的时间戳,此时使用BIGINT类型是一个不错的选择。在MySQL中,BIGINT类型可以存储很大范围的整数,范围从-9223372036854775808到9223372036854775807。这个范围完全可以覆盖毫秒级时间戳的取值范围。
示例:
首先,我们需要创建一个表格来存储时间戳。我们可以使用以下SQL语句创建一个名为 timestamp_table 的表格:

CREATE TABLE timestamp_table(id INT PRIMARY KEY AUTO_INCREMENT,timestamp_column BIGINT DEFAULT UNIX_TIMESTAMP(NOW(3))* 1000
);

在上面的SQL语句中,我们定义了一个名为 timestamp_column 的BIGINT类型的字段,它的默认值为当前时间的毫秒级时间戳。 UNIX_TIMESTAMP(NOW(3))* 1000 这段代码可以获取当前时间的毫秒级时间戳。

接下来,我们来插入一条数据到 timestamp_table 表格中:

INSERT INTO timestamp_table (timestamp_column) VALUES (UNIX_TIMESTAMP(NOW(3)) * 1000);

这样就可以将当前时间的毫秒级时间戳插入到 timestamp_table 表格中的 timestamp_column 字段中。
如果我们想查看所有的时间戳数据,可以使用以下SQL语句查询:

SELECT * FROM timestamp_table;
SELECT FROM_UNIXTIME(timestamp_column / 1000) AS TIME FROM timestamp_table;
解决“2038年问题”的一种方法

解决“2038年问题”的一种方法是将秒级时间戳也用bigint类型存储。
仍然以上面示例中的timestamp_table 的表格里面timestamp_column 字段为例。我们稍微修改一下创建表格的语句里面的默认值:

CREATE TABLE timestamp_table(id INT PRIMARY KEY AUTO_INCREMENT,timestamp_column BIGINT DEFAULT UNIX_TIMESTAMP(NOW())
);

在上面的SQL语句中,我们定义了一个名为 timestamp_column 的BIGINT类型的字段,它的默认值为当前时间的秒级时间戳。 UNIX_TIMESTAMP(NOW()) 这段代码可以获取当前时间的秒级时间戳。

来插入和读取秒级UNIX时间戳:

INSERT INTO timestamp_table (timestamp_column) VALUES (UNIX_TIMESTAMP(NOW())); # 插入秒级UNIX时间戳SELECT FROM_UNIXTIME(timestamp_column) AS TIME FROM timestamp_table; # 读取秒级UNIX时间戳

可以直接用这种方法来验证:SELECT NOW(), UNIX_TIMESTAMP(NOW());
【完】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872061.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silicon Labs C8051F020 单片机 USB Debug Adapter适配器调试无法连接问题

在做单片机大作业,使用Keil,使用USB连接开发板。想要进入到调试或烧录功能时总是报错: Cannot connect to the selected USB debug adapterToolStick base adapter. Please check that the device is plugged in and not already in use 如图:首先按照老师发的教程逐个复查…

C# PriorityQueue优先队列

namespace PriorityQueueDemo {public class Task{public string Name { get; set; } }public class TaskPriorityComparer : IComparer<(int, int)>{public int Compare((int, int) x, (int, int) y){// 首先比较紧急程度,然后比较重要性int compareUrgency = x.Item1.…

如何修改网站后台登录地址以避免触发安全规则?

在某些情况下,网站后台登录地址可能会触发安全规则,导致无法正常登录。可以通过修改后台登录地址来避免这种情况。以下是具体步骤:修改目录名称:将后台目录名称修改为不包含敏感关键词的名称,例如将admin修改为admin-。 更新配置文件:确保所有配置文件中的后台路径指向新…

Vue2_了解核心概念和一个示例工程

本文做了简要的 Vue2 核心概念和示例工程介绍,包括两种 Vue 实例的挂载方式,并对比两者的区别;简单介绍了响应式,包括 data 对象内的数据,使用计算属性,使用 v-model 双向绑定,使用了 button 和 input 做了交互Vue2_了解核心概念和一个示例工程 写文的目的是为了梳理知识…

如何解决FTP连接超时问题?

在使用FTP连接时,如果遇到超时问题,可能是由于网络配置或服务器设置不当导致的。以下是具体步骤:检查FTP端口:确保FTP端口(默认为21)在服务器防火墙中已开放。 检查本地网络:确保本地网络连接正常,尝试更换网络环境后重新连接。 使用替代FTP地址:如果使用的是特定的FT…

如何下载文件到电脑桌面?

将文件从远程服务器下载到本地电脑桌面的操作看似简单,但对于初次接触此类任务的朋友来说,仍需掌握一些基本技巧。下面我们将详细介绍几种常用的下载方法,帮助您顺利完成操作。 方法一:通过FTP客户端下载 FTP(文件传输协议)是一种广泛应用于互联网上的标准协议,用于在客…

网站登录无响应,如何排查和解决?

您好,当您在尝试登录网站时遇到无响应的情况,这可能是由多种因素引起的。为了帮助您更有效地解决问题,我们将从以下几个方面进行详细分析,并提供相应的解决方案。 1. 服务器状态检查 首先,确保您的云服务器处于正常运行状态。服务器的意外重启或负载过高都可能导致网站无法…

如何解决虚拟主机上的数据库导入失败问题?

当您在虚拟主机上尝试导入数据库时遇到失败,这通常是由几个常见原因造成的。为了帮助您顺利解决问题,我们将从以下几个角度出发,为您提供详细的解决方案。 1. 确认数据库文件格式 首先,确保您要导入的SQL文件是正确的格式,并且与目标数据库版本兼容。不同版本的MySQL/Mari…

如何处理服务器遭受DDoS攻击后被封禁的情况?

当服务器遭遇大规模DDoS攻击并因此被封禁时,用户将面临严重的访问障碍。为了解决这一问题,您可以参考以下详细的解决方案:评估当前状况:首先明确攻击的具体情况,包括流量大小、持续时间以及受影响的服务范围。根据服务商提供的信息,了解封禁政策及其解除条件。一般情况下…

服务器升级配置后无法启动的原因及解决办法

在对服务器进行配置升级后,如果遇到无法启动的情况,可能是由以下几个方面的原因造成的:磁盘分区问题:某些情况下,升级过程中可能会出现磁盘分区丢失或损坏的现象。这会导致系统无法找到根文件系统,从而无法正常启动。此时,可以通过进入单用户模式来修复这个问题。具体做…

虚拟主机能否新增多个数据库及其管理方式

关于虚拟主机是否支持新增多个数据库的问题,答案是可以实现的,但具体实施方式取决于所选用的服务商和套餐类型。以下是几种常见的解决方案及其优缺点分析:单独购买额外数据库实例:许多虚拟主机服务商允许用户单独购买MySQL或其他类型的数据库实例。每个实例都是独立存在的,…

微擎程序安装后报错缺少ixed.5.6.win

您好,针对您提到的微擎程序安装后报错缺少ixed.5.6.win的问题,我们进行了详细的分析。这个错误通常意味着您的PHP环境中缺少SourceGuardian解密器,而微擎程序依赖于该解密器来运行加密后的代码。 为了解决这个问题,建议您按照以下步骤进行操作:下载并安装SourceGuardian解…