Предупреждение о вставке при использовании STR_TO_DATE с неправильным форматом

#mysql

#mysql

Вопрос:

это было немного странно, если я запускаю запрос без инструкции insert, он всегда работает, но если я попытаюсь поместить в свою временную таблицу, отображается ошибка 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'
  

* Извините, если это не представлено в виде запроса leggit из 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
sampleerror2

Это была ошибка:

Код ошибки: 1411. Неверное значение даты и времени: ‘2019-12-17’ для функции str_to_date

Ответ №1:

Когда 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;
  

Комментарии:

1. Спасибо, я постараюсь.

2. Большое вам спасибо, что решили проблему, каждый день узнается что-то новое. Я не мог оценить ваш ответ, я бы дал вам 1.