mySQL str_to_date()函数返回错误

时间:2016-08-03 21:11:32

标签: mysql sql database

尝试使用str_to_date()将我的Estimates表中字符串日期值的列CreatedDate转换为mySQL日期格式时,我一直收到错误消息。我的数据列包含m / d / yy格式的日期(例如:2016年1月26日或3/3/16)。

我运行了这个查询:

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

mySQL返回此错误消息:

sudo service apache2 restart

我的查询有什么问题?

3 个答案:

答案 0 :(得分:2)

它会在您的专栏中点击空白值。

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

我认为这会输出稿件,如果您将日期字段设置为无效日期,则无效日期。

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

这将为空值和空白

留下1901-01-01值

添加到tadman:

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

如果您愿意,可以使用Null而不是1901-01-01。

答案 1 :(得分: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 :(得分:2)

禁用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-00FROM_DAYS(0)返回相同的值。因此NULLIF会将零日期转换为NULL

This answer很有帮助。