最近遇到一个 STR_TO_DATE 的问题,一直没有找到原因:
使用 STR_TO_DATE 函数作为查询条件,可以查询出数据
使用 STR_TO_DATE 函数作为删除的过滤条件,却报错了
STR_TO_DATE 的简单使用示例
SELECT
STR_TO_DATE('2020-02-26 12:11:33','%Y-%m-%d %H:%i:%s'),
STR_TO_DATE('2020-02-26 12:11:33','%Y-%m-%d %H:%i'),
STR_TO_DATE('2020-02-26', '%Y-%m-%d')
FROM DUAL;
输出结果
2020-02-26 12:11:33
2020-02-26 12:11:00
2020-02-26
问题还原
删除日期小于今天的数据,因保存日期的字段类型是字符串,故先转换为日期,再去删除数据。
1.建表
CREATE TABLE `tmp_string_date` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`save_day` varchar(50) DEFAULT NULL COMMENT '保存的时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.插入一条数据
INSERT INTO `tmp_string_date` (`id`,`save_day`) VALUES (1,'2020-02-26 12:11:33');
3.删除这条数据
delete from tmp_string_date where STR_TO_DATE(save_day,'%Y-%m-%d %H:%i') < now();
删除居然报错了,日期格式化为 ‘%Y-%m-%d %H:%i’ ,没有精确到秒居然报错了,错误信息为:
Error Code: 1292. Truncated incorrect datetime value: '2020-02-26 12:11:33' 0.000 sec
4.换一种格式化方式,精确到秒,可以删除成功
delete from tmp_string_date where STR_TO_DATE(save_day,'%Y-%m-%d %H:%i:%s') < now();
5.不精确到秒,改为查询语句却可以执行成功
select * from tmp_string_date where STR_TO_DATE(save_day,'%Y-%m-%d %H:%i') < now();
特此记录,待解决。。。