mysql - 使用格式错误的 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;
这是错误:
错误代码:1411。日期时间值不正确:函数 str_to_date 的“2019-12-17”
解决方案
当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;
推荐阅读
- visual-studio-code - Visual Studio 代码上的 404 实时服务器错误
- java - 如何将多种类型的 ArrayList 传递给 Java 中的函数?
- scala - 如何使用 jena elephas 和 spark 运行 sparql
- android - 在 .sh 文件中使用命令 echo 在 TWRP 恢复中不起作用。如何在 TWRP 中使用脚本 .sh 显示消息
- sql - T-SQL Select where "IN" 非常糟糕 性能影响
- php - 如何在 Webuzo VPS 中使用 PHPMailer
- laravel-5 - What is not equal to in Laravel?
- sql - SQL regular expression for date
- asynchronous - Async.Start 与 timeout 和 cancelToken?
- azure-active-directory - 在 Graph API beta 端点上创建 Azure AD 应用程序时出错