Na minha pergunta anterior ( str_to_date está mostrando NULL quando a data está disponível ), eu estava tentando atualizar uma data e hora VARCHAR para um formato de data.
Esta é a consulta de atualização que estou usando:
UPDATE `table` SET `dateColumn` = CASE
WHEN `dateColumn` = '' THEN NULL
ELSE date_format(str_to_date(`dateColumn`, '%m-%d-%Y %h:%i:%s %p'), '%Y-%m-%d') END;
A consulta acima deve procurar uma data na dateColumn. Se a data estiver em branco, defina-a como NULL. Caso contrário, altere o formato da data.
O que notei é que se dateColumn não corresponder ao formato que especifiquei, em vez de interromper a consulta e produzir um erro, a consulta emite um aviso que diz isto:
Warning: #1411 Incorrect datetime value: '9/9/2024 12:00:00 AM' for function str_to_date
Entendo que o formato está errado porque há barras em vez de traços.
O problema é que, quando recebo o aviso acima, a consulta continua sendo executada, mas altera todas as datas, estejam em branco ou não, para NULL.
Não quero que a consulta marque todas as datas como NULL. Apenas as datas em branco. Isso não está acontecendo por algum motivo e, quando isso acontece, tenho que truncar os dados, importá-los novamente e começar de novo.
O que aconteceu com a consulta parando no erro?
Por que estou recebendo um aviso?
Por que a consulta está alterando todas as datas para NULL?
Preciso atualizar minha consulta para que ela não altere todas as datas para NULL? Se sim, como?
Leia https://dev.mysql.com/doc/refman/8.4/en/date-and-time-functions.html#function_str-to-date :
(ênfase minha)
Não diz que interrompe a consulta ou produz um erro.
Ele muda as datas para NULL porque você deu
STR_TO_DATE()
um formato que não corresponde aos dados. Ou seja, a diferença entre traços e barras é significativa.Demonstração:
Conforme o manual descreve, quando ele não consegue analisar os dados de acordo com o formato que você informou, ele retorna NULL.
Talvez você queira programar defensivamente e aplicar expressões somente a dados com formato correspondente:
Neste exemplo, a
ELSE
cláusula é uma operação nula; ela retorna o valor original dedateColumn
, porque nenhum dos outros casos correspondeu.Isso deixa o valor em um formato que pode não ser uma data válida, mas pelo menos não foi perdido. Você pode tentar consertar os retardatários um por um, em vez de ter que reimportar todos os dados.