#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;
Это была ошибка:
Код ошибки: 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.