首页 > 解决方案 > 使用格式错误的 STR_TO_DATE 时插入警告

问题描述

这个有点奇怪,如果我在没有插入语句的情况下运行查询,它总是可以工作,但是如果我尝试放在我的临时表上,显示 han 错误,还有其他方法可以验证日期是否有格式? 这是我来自所有值都是(varchar)的表中的数据,这是因为使用了该表:

 #   c3,         c4,            c5,          import
'2019-12-17', '2020-01-01', '2021-01-01', '987654321'
'2019-12-17', '2020-01-01', '2021-01-01', '987654321'
'2019-12-17', '2020-01-01', '2021-01-01', '987654321'
'2019-12-17', '2020-01-01', '2021-01-01', '987654321'
'2019-12-17', '2020-01-01', '2021-01-01', '987654321'
'17/12/2019', '01/01/2020', '01/01/2021', '987654321'
'17/12/2019', '01/01/2020', '01/01/2021', '987654321'

*抱歉,如果这没有表示为来自 DB 的合法查询。仅用于示例。 我有我的疑问:

create temporary table TbPoblacion (fec_emision datetime, fec_vig_de datetime, fec_vig_a datetime, importacion_id int(11));

insert into TbPoblacion(fec_emision, fec_vig_de, fec_vig_a, importacion_id)
SELECT 
CASE WHEN to_days(STR_TO_DATE(il.c3, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c3, "%d/%m/%Y") ELSE il.c3 END date_emision, 
CASE WHEN to_days(STR_TO_DATE(il.c4, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c4, "%d/%m/%Y") ELSE il.c4 END date_vig_from, 
CASE WHEN to_days(STR_TO_DATE(il.c5, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c5, "%d/%m/%Y") ELSE il.c5 END date_vig_to
FROM ImportationLayout il
WHERE il.importacion_id=987654321;

如果我在没有该语句的情况下运行相同的查询,它会起作用:

SELECT 
CASE WHEN to_days(STR_TO_DATE(il.c3, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c3, "%d/%m/%Y") ELSE il.c3 END date_emision, 
CASE WHEN to_days(STR_TO_DATE(il.c4, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c4, "%d/%m/%Y") ELSE il.c4 END date_vig_from, 
CASE WHEN to_days(STR_TO_DATE(il.c5, "%d/%m/%Y")) is not null THEN STR_TO_DATE(il.c5, "%d/%m/%Y") ELSE il.c5 END date_vig_to
FROM ImportationLayout il
WHERE il.importacion_id=987654321;

样本 1 样本错误2

这是错误:

错误代码:1411。日期时间值不正确:函数 str_to_date 的“2019-12-17”

标签: mysql

解决方案


SELECT查询用作 的源时INSERT,一些可能只是警告和返回NULL的条件被视为致命错误。这就是SELECT查询本身有效的原因,但与INSERT.

不要调用str_to_date()来查看它是否与dd/mm/yyyy模式匹配,而是使用简单的模式匹配LIKE.

您还缺少列表importacion_id中的SELECT列。

insert into TbPoblacion(fec_emision, fec_vig_de, fec_vig_a, importacion_id)
SELECT 
CASE WHEN il.c3 LIKE '%/%/%' THEN STR_TO_DATE(il.c3, "%d/%m/%Y") ELSE il.c3 END date_emision, 
CASE WHEN il.c4 LIKE '%/%/%' THEN STR_TO_DATE(il.c4, "%d/%m/%Y") ELSE il.c4 END date_vig_from, 
CASE WHEN il.c5 LIKE '%/%/%' THEN STR_TO_DATE(il.c5, "%d/%m/%Y") ELSE il.c5 END date_vig_to,
il.importacion_id
FROM ImportationLayout il
WHERE il.importacion_id=987654321;

推荐阅读