UPDATE `smart_userstest`
SET lastlogin = STR_TO_DATE(lastlogin,'%d/%m/%y %h:%i')
WHERE lastlogin REGEXP('^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$')
有一个我以前用过的查询...除了现在我收到错误。
所以我输入了excel电子表格来点击我的数据库。很多日期字段。大多数是我想要修复的新格式。 m / d / yyyy小时:分钟,月,日,小时和分钟可以是1-2个数字。我想简单地删除小时:min部分并将日期设置为正确的MySql DATE。此外,我希望它考虑到小时:最小部分留空,因为我有两个。
示例错误: 1411 - 日期时间值不正确:' 1/24/2014'对于函数str_to_date
答案 0 :(得分:1)
您可以使用case
:
UPDATE `smart_userstest`
SET lastlogin = (case when lastlogin like '%/%/% %:%' then STR_TO_DATE(lastlogin,'%d/%m/%y %h:%i')
when lastlogin like '%/%/%' then STR_TO_DATE(lastlogin,'%d/%m/%y')
end)
WHERE lastlogin REGEXP('^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$');
对我而言,将字符列设置为日期很奇怪。
更好的方法是将数据加载到临时表smart_userstest_staging
。所有列都是varchar()
。加载它应该没有错误。
然后在每个字段上创建带有逻辑的smart_userstest
以将其转换为正确的值或检查值是否正确(通常,您只需复制它们)。这使您能够轻松地在原始表中查找错误数据,并极大地帮助解决问题。
修改数据可以防止您对要使一切正常工作所做的事情进行审计跟踪。这意味着下次你必须完成任务时,你必须重新学习所有东西。如果加载到临时表中,逻辑将全部封装在SQL查询中,该查询将数据从登台表传输到真实表。
编辑:
试试这个:
UPDATE `smart_userstest`
SET lastlogin = STR_TO_DATE(substring_index(lastlogin, ' ', 1),'%d/%m/%y')
WHERE lastlogin REGEXP('^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$');
这只选择字符串的m/d/yyyy
部分。顺便说一下,我看不到小时/分钟的字符串是如何传递REGEXP
模式的。我认为问题可能出在其他地方。