str_to_date在mysql中让我疯了

时间:2014-01-31 21:38:17

标签: mysql date

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

1 个答案:

答案 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模式的。我认为问题可能出在其他地方。