【问题标题】:MySQL Trigger STR_TO_DATE(NEW.invoice_date, '%d/%m/%Y')MySQL 触发器 STR_TO_DATE(NEW.invoice_date, '%d/%m/%Y')
【发布时间】:2017-12-25 22:09:54
【问题描述】:

我正在尝试在插入之前创建一个 MySQL 触发器:

BEGIN
    SET NEW.order_date = STR_TO_DATE(NEW.order_date, '%d/%m/%Y');
END

但是当我导入包含“05/07/2017”等记录的 .csv 时,触发器只导入 NULL

知道如何解决这个问题吗?

【问题讨论】:

  • 在触发这一点时,order_date 已经被强制转换为 date。它不再是初始字符串形式。
  • 因此,如果我将列 order_date 更改为 VarChar 并创建新列,例如 order_date_fixed,其格式为 DATE,并且触发器更改为:BEGIN SET NEW.order_date = STR_TO_DATE(NEW.order_date_fixed, '%d /%我的'); END 它会按预期工作吗?
  • 只需在触发器中省略转换即可。
  • @FinrodFElagund 您的字段方向错误。正如您所描述的,您实际上需要执行SET NEW.order_date_fixed = STR_TO_DATE(NEW.order_date, '%d/%m/%Y')。并不是说这是一个很好的解决方案,因为它可能会导致其中一个日期稍后更新但另一个日期不会更新的问题,并且您最终会遇到潜在的逻辑问题。我更喜欢在导入之前修复 CSV 文件的选项。

标签: mysql sql date triggers format


【解决方案1】:

在搜索中,这似乎是一个在各个地方被问过几次的问题,但我几乎找不到原因的解释。

正如我在上面的评论中提到的,触发器在过程中为时已晚,无法适当地转换数据。

为了触发触发器,必须将数据转换为适当的数据类型以插入到表中。

因此,当将数据传递给str_to_date() 时,您只有可用的强制date 字段,而不是初始字符串。

有两种方法可以解决此问题:

  1. 在导入前修复文件中的日期格式
  2. 使用临时 varchar 字段导入,然后使用触发器将其转换为 date 字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多