2016-08-03 16 views
4

Ich erhalte eine Fehlermeldung beim Versuch, eine Spalte CreatedDate von String-Datum Werte in meine Schätzungen Tabelle in das mySQL-Datumsformat mit str_to_date() zu konvertieren. Meine Datenspalte enthält Daten im Format "m/d/yy" (zum Beispiel: 1/26/16 oder 3/3/16).mySQL str_to_date() -Funktion gibt Fehler

lief ich diese Anfrage:

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

mySQL diese Fehlermeldung zurückgibt:

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 

Was mit meiner Anfrage falsch ist?

+0

Haben Sie Zeilen, in denen dieses Feld leer ist? –

+0

Idealerweise sollten Sie eine neue 'DATE'-Spalte erstellen und dann mit dieser Funktion vom alten Zeichenfolgenwert auf den neuen' DATE' wechseln. Sie müssen auch die Werte überspringen, die leer oder "NULL" sind. Intern bevorzugt MySQL formatierte Daten nach ISO-8601: JJJJ-MM-TT. – tadman

+0

@tadman Wie kann ich meine Abfrage anpassen, um die Werte zu berücksichtigen, die NULL sind? Wenn ich eine neue DATE-Typspalte erstelle, wie lautet die Abfrage, um die Werte von CreatedDate in das richtige Datumsformat zu konvertieren und sie in die neue Spalte zu verschieben? Danke für Ihre Hilfe! – Liz

Antwort

2

Die übliche Strategie für Daten wie diese Reinigung ist wie folgt:

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 != '' 

Dann, wenn Sie richtig konvertiert sind und es sicher alles:

ALTER TABLE Estimates DROP COLUMN CreatedDateString 

Der Vorteil richtige DATE Felder ist sie sind in einem konsistenten Format und wenn Sie eine INDEX auf ihnen hinzufügen Datenabruf ist sehr schnell, auch in Bereichen, wie:

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

Es trifft leere Werte in Ihrer Spalte.

Ich denke, dass dies ausliefert und das als ein ungültiges Datum funktioniert, wenn Sie ein Datumsfeld darauf einstellen.

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

Das 1901.01.01 Werte für NULL-Werte und leere

hinzugefügt Tadman verlassen:

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

Nulls statt 1901.01.01 wenn Sie es vorziehen.

+0

Junk-Dates sind schlechte Form. So werden Menschen als 115 Jahre alt eingestuft. Wenn es leer oder 'NULL' ist, setze es auf' NULL'. – tadman

+0

@tadman - Alternative hinzugefügt, Nullen anstelle der 1901-01-01 zu lassen, hoffentlich Adressen der dv – Twelfth

+0

Jetzt reden wir. Vielen Dank. Sie können auch die 'IF (...)' Funktion verwenden, wenn Ihr 'CASE' nur einen Fall hat. – tadman

0

Disable NO_ZERO_DATE SQL-Modus:

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

Ihre Anweisung ausführen:

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

Dann ursprünglichen SQL-Modi aktivieren:

set sql_mode = @old_sql_mode; 

NO_ZERO_DATE Modus ausschalten, wird STR_TO_DATE Rückkehr Null Datum machen 0000-00-00 für ungültige Datumszeichenfolgen Derselbe Wert wird von FROM_DAYS(0) zurückgegeben. So wird NULLIF Nulldaten in NULL konvertieren.

This answer war hilfreich.