2016-08-03 99 views
4

當我嘗試使用str_to_date()將我的Estimates表中字符串日期值的列CreatedDate轉換爲mySQL日期格式時,我總是收到一條錯誤消息。我的數據列包含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格式的日期:YYYY-MM-DD。 – tadman

+0

@tadman如何調整我的查詢來解釋NULL值?如果我創建了一個新的DATE類型列,那麼將查詢的值從CreatedDate轉換爲正確的日期格式並將它們移動到新列中的查詢是什麼?感謝您的幫助! – 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年1月1日的價值觀和空白

加入tadman:

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

空值,而不是1901年1月1日,如果你喜歡。

+0

加入垃圾日期是不好的形式。這就是人們最終被定爲115歲的原因。如果它是空白或NULL,則將其設置爲NULL。 – tadman

+0

@tadman - 替代地添加了空的而不是1901-01-01,希望能夠解決dv – Twelfth

+0

現在我們在談論。謝謝。當你的CASE只有一個case時,你也可以使用'IF(...)'函數。 – 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很有幫助。