错误代码:1411。日期时间值不正确:' 0000-00-00'对于函数str_to_date

时间:2016-06-15 00:58:28

标签: mysql triggers str-to-date

我尝试在插入之前更改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;

这是我的触发器BEFORE INSERT

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

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

1 个答案:

答案 0 :(得分:0)

您正在尝试插入格式错误的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。或者,您应该清理日期格式以匹配其中一种可接受的格式。