mysql 1292错误码,timestamp存储范围问题

111

问题

生产上出现了数据添加失败的情况 (设置一条信息的有效时长, 到期自动失效 )

bug

查看日志发现了是 insert 的时候报错了.
在测试环境也能 正常复现, 设置到期时间(end_time)为 2040年以后的任意时间都不行

复现

正常情况是这样的:
在这里插入图片描述
异常情况是这样的:
在这里插入图片描述
遇见这样的问题 就可以 直接去百度 他提示的 错误码 1292 就能找到答案了

原因

这个表的时间类型是 : timestamp
在这里插入图片描述

解释

MYSQL timestamp取值范围是 1970-01-01 00:00:00 到 2038-01-19 3:14:07
TIMESTAMP和DATETIME的取值范围不同同时存储不同,
TIMESTAMP占四个字节取值范围为 1970-01-01 00:00:00 到 2038-01-19 3:14:07

有待考证:

那么为什么是这个取值范围呢 4个字节明显不够存储日期格式。4字节为2^32次方
那么我们可以分析timestamp实际是C语言的一个INT 类型带符号位的。
用ORACLE的格式算出来为

SQL> select to_date('1970-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')+(power(2,31)-1)/(60*60*24) from dual;

-- TO_DATE('1970-01-0100:00:00','
-- ----------------------------
-- 2038/1/19 3:14:07

解决方案:

将时间戳格式给为 datetime 就可以了

create table `test_time_bak_20220505` as select * from `test_time`;

alter table `test_time` modify column `end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;

改完以后的数据:
在这里插入图片描述
在这里插入图片描述
参考文档 =https://blog.csdn.net/qq1137623160/article/details/79142254

每日上一当, 当当不一样.

每日踩一坑, 坑坑都很深.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MySQL中的timestamp类型是用来存储日期和时间的数据类型,范围查询是指查询某个时间段内的数据。在MySQL中,可以使用BETWEEN和AND关键字来进行范围查询,例如: SELECT * FROM table_name WHERE timestamp_column BETWEEN '2021-01-01 00:00:00' AND '2021-01-31 23:59:59'; 这条语句将查询table_name表中timestamp_column列在2021年1月1日至1月31日之间的所有数据。 ### 回答2: MySQL中的timestamp数据类型精确到秒,是一种常见的日期时间类型。在MySQL中,我们常常需要进行timestamp类型的范围查询,来获取某个时间段内的数据。 在MySQL中进行timestamp范围查询,我们可以使用“BETWEEN AND”命令来实现。该语句用于查找在一个时间范围内的数据记录。 例如,我们需要查找从2021年1月1日到2022年12月31日的所有订单记录,可以使用以下SQL语句: SELECT * FROM orders WHERE order_time BETWEEN '2021-01-01 00:00:00' AND '2022-12-31 23:59:59'; 上述SQL语句中的“order_time”是订单的时间戳字段,其中的“BETWEEN”表示在某个时间段之间,而“AND”则表示时间范围的上下限。 需要注意的是,在MySQL中,时间戳的存储格式为“YYYY-MM-DD HH:MM:SS”,因此在进行查询时,我们需要按照该格式来指定时间戳的上下限。 此外,我们也可以用“>=”和“<=”符号来实现timestamp范围查询。例如,以下SQL语句也可以获取到从2021年1月1日到2022年12月31日的所有订单记录: SELECT * FROM orders WHERE order_time >= '2021-01-01 00:00:00' AND order_time <= '2022-12-31 23:59:59'; 总之,在查询timestamp类型的范围时,我们可以使用“BETWEEN AND”或“>=”和“<=”符号来指定时间戳的上下限,进而实现范围查询。 ### 回答3: MySQLtimestamp是用来表示日期和时间的数据类型。当我们需要查询一个时间范围时,可以使用timestamp范围查询来实现,可以使用BETWEEN关键字, 也可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)的比较操作符实现。 MySQLtimestamp存储范围是从1970年1月1日00:00:01到2038年1月19日03:14:07,如果需要查询这个范围内的数据,可以使用以下代码进行查询: SELECT * FROM table_name WHERE timestamp_column >= '1970-01-01 00:00:01' AND timestamp_column <= '2038-01-19 03:14:07' 如果需要查询比某个时间早或晚的数据,可以使用如下代码: SELECT * FROM table_name WHERE timestamp_column > '2022-01-01 00:00:00' --查询2022年1月1日之后的数据 SELECT * FROM table_name WHERE timestamp_column < '2022-01-01 00:00:00' --查询2022年1月1日之前的数据 如果需要查询在某个时间段内的数据,可以使用BETWEEN关键字来实现,如下代码所示: SELECT * FROM table_name WHERE timestamp_column BETWEEN '2022-01-01 00:00:00' AND '2022-06-30 23:59:59' --查询2022年1月1日到2022年6月30日之间的数据 在使用timestamp进行范围查询时,需要注意几点: 1. 时间范围的上下限需要与timestamp类型的存储范围相匹配,否则可能无法查询到正确的数据。 2. 查询条件中的时间格式需要与timestamp类型存储的格式一致,否则也可能会出现数据查询不到的情况。 3. 如果查询的表中有大量数据,为了提高查询效率,可以在timestamp列上创建索引。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值