【问题标题】:str_to_date driving me nuts in mysqlstr_to_date 让我在 mysql 中发疯
【发布时间】:2014-01-31 21:38:17
【问题描述】:
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 hour:min 其中月、日、小时和分钟可以是 1-2 个数字。我想简单地摆脱小时:分钟部分并将日期设置为正确的 MySql DATE。此外,我希望它能够说明 hour:min 部分留空,因为我两者都有。

示例错误: 1411 - 不正确的日期时间值:函数 str_to_date 的“1/24/2014”

【问题讨论】:

  • STR_TO_DATE(lastlogin,'%d/%m/%y')?
  • @RocketHazmat - 然后我得到“ 1411 - 错误的日期时间值:'9/24/2013 14:32' for function str_to_date” - 这是我尝试的第一件事。
  • 啊,我明白了。你两者都有,需要同时解析。
  • 你为什么将上次登录存储为字符串而不是 DATETIME?
  • @kba - 我只是在它是导入的意义上存储它。问题的目的是我不想将其存储为字符串并希望将其设置为 DATE (时间无关紧要)。如果我将该字段设置为 DATE,那么如果格式不完全正确,“用户”文件将失败 - 所以他们可能会花费 20 年的时间来更新他们的东西。

标签: mysql date


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

【讨论】:

  • 我现在实际上是直接在临时表上执行此操作,直到我让它工作 - 因此表名中的“测试”。在修改后的答案中出现错误“[Err] 1411 - Incorrect datetime value: '1/24/2014' for function str_to_date”。
  • @blankip 。 . .值有问题。它必须包含其他字符。 RocketHazmat 的解决方案也应该有效。您不应该对临时表进行更新,而只是查询(如果您愿意,可以将其放入临时表中)。
  • 感谢会重新加载,因为我在行中并且没有看到任何额外的字符...如果 mysql 让我选择我的格式会容易得多。
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 2012-11-02
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多