尝试使用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
我的查询有什么问题?
答案 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-00
,FROM_DAYS(0)
返回相同的值。因此NULLIF
会将零日期转换为NULL
。
This answer很有帮助。