最近遇到一個 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();
特此記錄,待解決。。。