首页 > 数据库 >MySQL里面的时间与UNIX时间戳,解决2038年问题的思考

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

时间:2025-01-20 11:55:13浏览次数:1  
标签:01 20 timestamp UNIX 时间 MySQL NOW 2038

当前时间: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());
【完】

标签:01,20,timestamp,UNIX,时间,MySQL,NOW,2038
From: https://www.cnblogs.com/xiongzaiqiren/p/18681019

相关文章

  • MySQL不香吗,为啥还要Elasticsearch?
    一、先说说MySQL有啥优点MySQL这玩意,咱们都熟。行存储的代表,关系型数据库的中流砥柱。它有啥好处?老铁,太多了:数据一致性:事务支持那是杠杠的,ACID四大天王保护你数据不丢失。结构化查询:SQL语句一出,啥复杂查询都能搞定,分组、排序、子查询,随便玩。成熟稳健:发展几十年,社区大,文档多,踩......
  • 数据库基础——mysql数据库
    一、数据库简介    数据库:数据库是一个按数据结构来存储和管理数据的计算机软件系统。简单来说,数据库是用来存放数据的。    常见数据库及端口mysql(3306):关系型数据库  mssal(1433)  oracle(1521)  db2(9500)  postgresql(5432)       ......
  • Mysql--实战篇--@Transactional失效场景及避免策略(@Transactional实现原理,失效场景,内
    在Spring框架中,@Transactional注解用于声明式事务管理,能够简化事务的处理逻辑。然而,在某些情况下,@Transactional可能会失效,导致事务无法按预期工作。了解这些失效场景及其原因,可以帮助你更好地管理和调试事务问题。1、@Transactional失效的常见场景(1)、方法非public访问权......
  • 如何将MySQL数据库版本升级到5.7并确保网站正常运行?
    在云服务器上将MySQL数据库版本从较低版本升级到5.7是一项需要谨慎操作的任务,以确保网站的正常运行。以下是详细的步骤和注意事项:一、备份现有数据备份数据库:在进行任何升级操作之前,务必对现有数据库进行全面备份。可以使用命令行工具或图形界面工具(如phpMyAdmin)进行备份。......
  • 【数据库】MySQL数据库之约束与多表查询
    约束1.概述概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据目的:保证数据库中数据的正确性、有效性,完整性和一致性分类:注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束2.外键约束概念外键用来让两张表的数据之间建立连接,从而保证数据的一致性......
  • Ubuntu 安装Mysql
    使用apt安装MySQL更新系统包在安装MySQL之前,先更新系统的包列表:sudoaptupdate安装MySQL运行以下命令安装MySQL服务器:sudoaptinstallmysql-server启动MySQL服务安装完成后,MySQL服务会自动启动。如果没有启动,可以手动启动:sudosystemctlstartmysql设......
  • MySQL 死锁处理
    死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。1数据库层面解决死锁的两种方式1、解决死锁的问题最简单的方式是不要有等待,将任何的等待都转化为回滚,并且事务重新开始。 这种没有死锁问题的产生。在线上环境中,可能导致并发性能的下降,甚......
  • Mysql 5.7解决windows本地无法开启服务-1067
    出现原因:我切换mysql8服务后,切换回去mysq5.7,然后报下面的问题。删除后应该可以 但是可能因为我有两个服务,一个5.7,一个8.0然后我继续报错:D:\Monkey\mysql-5.7.33-winx64\bin>netstartMySQL57mysql57服务正在启动.mysql57服务无法启动。服务没有报告任何错误。......
  • 1.MySql基础架构之SQL语句的执行
    1.MySQL数据库的整体架构(i)连接器:连接器负责与客户端建立连接,获取权限、维持和管理连接。连接命令中的mysql是客户端工具,用来建立服务端连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。​ 如果用户名密码认证通过,连接器会到权限......
  • MySQL数据库笔记——主从复制
    大家好,这里是GoodNote,关注公主号:Goodnote,本文详细介绍MySQL的主从复制,从原理到配置再到同步过程。文章目录简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从复制的配置步骤优化和改进总结历史文章简介MySQ......