1

挿入する前に、CSV ファイルから日付の形式を変更しようとしています。BEFORE INSERT トリガーを作成しましたが、機能していないようです。

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

どんな助けでも大歓迎です!ありがとう。

4

1 に答える 1

0

date間違った形式の列を挿入しようとしているため、このエラーが発生しています。MySQLのドキュメントには、受け入れ可能な形式がリストされています。

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または、日付のフォーマットをクリーンアップして、許容されるフォーマットのいずれかに一致させる必要があります。

于 2016-06-15T01:18:38.653 に答える