2016-08-03 4 views
4

Я получаю сообщение об ошибке при попытке конвертировать столбец «CreatedDate» значений строковых дат в моей таблице «Оценки» в формат даты mySQL с использованием str_to_date(). В моем столбце данных указаны даты в формате m/d/yy (например: 1/26/16 или 3/3/16).Функция mySQL str_to_date() возвращает ошибку

Я побежал этот запрос:

UPDATE Estimates 
SET CreatedDate = str_to_date(CreatedDate, '%c/%e/%y') 

MYSQL возвращает сообщение об ошибке:

Error 
SQL query: 
UPDATE Estimates 
SET CreatedDate = str_to_date(CreatedDate, '%c/%e/%y') 
MySQL said: #1411 - Incorrect datetime value: '' for function str_to_date 

Что случилось с моим запросом?

+0

У вас есть строки, в которых это поле пуст? –

+0

В идеале вы должны создать новый столбец типа DATE, а затем переключиться с старого значения строки на новый 'DATE', используя эту функцию. Вам также придется пропустить те значения, которые пусты или 'NULL'. Внутри MySQL предпочитает ISO-8601 отформатированные даты: ГГГГ-ММ-ДД. – tadman

+0

@tadman Как я могу настроить свой запрос на учетную запись для значений NULL? Если я создаю новый столбец типа DATE, каков будет запрос для преобразования значений из CreateDate в правильный формат даты и переноса их в новый столбец? Спасибо за помощь! – Liz

ответ

2

Обычная стратегия для очистки данных, как это выглядит следующим образом:

ALTER TABLE Estimates CHANGE COLUMN CreatedDate CreatedDateString VARCHAR(255); 
ALTER TABLE Estimates ADD COLUMN CreatedDate DATE 

UPDATE Estimates SET CreatedDate=STR_TO_DATE(CreatedDateString, '%c/%e/%y')) 
    WHERE CreatedDateString IS NOT NULL AND CreatedDateString != '' 

Тогда, когда вы уверены, что все получили конвертируется правильно:

ALTER TABLE Estimates DROP COLUMN CreatedDateString 

Преимущество собственных DATE полей они 'в согласованном формате, и когда вы добавляете INDEX, данные извлекаются очень быстро, даже в диапазонах, например:

SELECT * FROM Estimates WHERE CreatedDate BETWEEN '2016-01-01' AND '2016-06-30' 
2

Это пустые значения в столбце.

SET CreatedDate = str_to_date('', '%c/%e/%y') 

Я думаю, что это выводит 0000-00-00 и работает как недействительные даты, если вы настраиваете поле даты для этого.

SET CreatedDate = STR_TO_DATE(IFNULL(case when CreatedDate = '' then null else createddate end,'1901-1-1'), '%c/%e/%y') 

Это оставит 1901-01-01 значения нулям и пустой

Добавлено в Тадман:

SET CreatedDate = STR_TO_DATE(case when CreatedDate = '' then null else createddate end, '%c/%e/%y') 

NULLS вместо 1901-01-01 если вы предпочитаете.

+0

Ввод в мусорные даты - плохая форма. Именно так люди в конечном итоге привязаны к 115 годам. Если он пустой или 'NULL', установите его в значение« NULL ». – tadman

+0

@tadman - alternate добавлен, чтобы оставить nulls вместо 1901-01-01, надеюсь, обращается к dv – Twelfth

+0

Теперь мы говорим. Благодарю. Вы также можете использовать функцию 'IF (...)', если ваш 'CASE' имеет только один случай. – tadman

0

Отключить режим NO_ZERO_DATE SQL:

set @old_sql_mode = @@sql_mode; 
set sql_mode = ''; 

Показывайте заявление:

UPDATE Estimates 
SET CreatedDate = NULLIF(str_to_date(CreatedDate, '%c/%e/%y'), FROM_DAYS(0)) 

Затем включить оригинальные режимы SQL:

set sql_mode = @old_sql_mode; 

Отключение режима NO_ZERO_DATE сделает STR_TO_DATE вернуть нулевой дата 0000-00-00 за неверные строки даты , то же значение возвращается FROM_DAYS(0). Таким образом, NULLIF преобразует нулевые даты в NULL.

This answer был полезен.