【问题标题】:Error Code: 1411. Incorrect datetime value: '0000-00-00' for function str_to_date错误代码:1411。日期时间值不正确:函数 str_to_date 的“0000-00-00”
【发布时间】:2016-10-15 22:07:51
【问题描述】:

我正在尝试在插入之前更改 CSV 文件中的日期格式。我在插入之前创建了一个触发器,但它似乎不起作用。

CREATE TABLE items (
  item_id int(11) NOT NULL AUTO_INCREMENT,
  price_list_id int(11) NOT NULL,
  sku varchar(20) NOT NULL,
  description varchar(45) DEFAULT NULL,
  cost float NOT NULL DEFAULT '0',
  notes varchar(45) DEFAULT NULL,
  discount_factor float DEFAULT '1',
  start_date date DEFAULT NULL,
  end_date date DEFAULT NULL,
  PRIMARY KEY (item_id,sku),
  KEY price_list_id_idx (price_list_id),
  CONSTRAINT price_list_id FOREIGN KEY (price_list_id) REFERENCES price_lists (price_list_id) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=105193 DEFAULT CHARSET=utf8;

这是我在插入之前的触发器

CREATE TRIGGER `pricelist`.`items_BEFORE_INSERT` BEFORE INSERT ON `items` FOR EACH ROW
BEGIN
    SET NEW.start_date = str_to_date(NEW.start_date, '%c/%e/%Y');
    SET NEW.end_date = str_to_date(NEW.end_date, '%c/%e/%Y');

END

假设查询是:INSERT IGNORE INTO pricelist.items (price_list_id, sku, description, cost, start_date, end_date, notes) VALUES ('15', '2494-22', 'M12 DRILL/IMPACT COMBO KIT', '129', '4/25/2016', '5/31/2016', 'CL6204');

我得到这个错误:

`Error Code: 1411. Incorrect datetime value: '0000-00-00' for function str_to_date`

如果我这样做(没有 IGNORE):

INSERT INTO pricelist.items (price_list_id, sku, description, cost, start_date, end_date, notes) VALUES ('15', '2494-22', 'M12 DRILL/IMPACT COMBO KIT', '129', '4/25/2016', '5/31/2016', 'CL6204');

我明白了:

Error Code: 1292. Incorrect date value: '4/25/2016' for column 'start_date' at row 1

虽然这可行:

SELECT str_to_date('5/31/2016', '%c/%e/%Y');

输出是:

2016-05-31

任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 我不确定,但我认为这与表中日期的默认 null 有关。
  • 很明显,日期时间值是错误的。
  • @RichardBarker 我会尝试删除它来查看。
  • 我认为您向 str_to_date 发送了错误的值。看起来您正在使用当前正在插入的行,而不是传递给插入语句的值......但我可能是错的。
  • the row currently be inserted and not the values passed to the insert statement ... 这些不是一回事吗?

标签: mysql triggers str-to-date


【解决方案1】:

您收到此错误是因为您尝试插入格式错误的date 列。 MySQL documentation 列出了可接受的格式:

MySQL 可以识别以下格式的 DATE 值:

作为 'YYYY-MM-DD' 或 'YY-MM-DD' 格式的字符串。允许使用“宽松”语法:任何标点字符都可以用作日期部分之间的分隔符。例如,“2012-12-31”、“2012/12/31”、“2012^12^31”和“2012@12@31”等价。

作为不带分隔符的字符串,采用 'YYYYMMDD' 或 'YYMMDD' 格式,前提是该字符串作为日期有意义。

作为 YYYYMMDD 或 YYMMDD 格式的数字,前提是该数字作为日期有意义。

但您的日期格式为MM/DD/YYYY,例如4/25/2016,所以这行不通。您似乎试图在插入之前使用触发器来更正格式。但是,MySQL 会在触发之前检查格式

如果您必须插入这种格式的日期数据,那么您应该使用VARCHAR 类型,然后调用STR_TO_DATE。或者,您应该清理日期格式以匹配可接受的格式之一。

【讨论】:

  • 似乎是一个正确的答案,我想也许 BEFORE INSERT 触发器会是一个解决方案。我会尝试找到另一个解决方案,谢谢。
  • 那么问题最后的select语句失败了?
  • 你很聪明地尝试使用BEFORE INSERT,但MySQL仍然对date的格式有限制。
  • @TimBiegeleisen 我想我会把它改成 varchar 并收工。 :P
  • @TimBiegeleisen 非常感谢!删除旧行,用 varchar 创建新行,我的触发器格式正确!
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2022-10-24
  • 2018-06-02
相关资源
最近更新 更多