MySQL неверное значение DateTime для даты старше 1980

While, пытаясь импортировать a .sql-файл в мою базу данных, я получаю следующую ошибку для одного из операторов insert -

ERROR 1292 (22007) at line 31504: Incorrect datetime value: '1936-01-31 00:00:00' for column 'BatchDate' at row 1. Operation failed with exitcode 1

я сталкиваюсь с этой ошибкой только для дат старше 1980 года. и это происходит только тогда, когда я пытаюсь импортировать дамп через оператор import или через WorkBench. Если я выполняю оператор в одиночку, он работает нормально. Вот структура таблицы и оператор insert

DROP TABLE IF EXISTS `BatchEntry`;

CREATE TABLE `BatchEntry` (
  `BatchNo` INTEGER NOT NULL AUTO_INCREMENT, 
  `BatchDate` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  `BTax_ID` DOUBLE NULL DEFAULT 0, 
  `BPayor_No` DOUBLE NULL DEFAULT 0, 
  `BBroker_No` DOUBLE NULL DEFAULT 0, 
  `BHam_Cont` VARCHAR(4), 
  `BInv_Org_Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  `BInv_Due_Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  `BDate_Adv` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  `BRec_Amt` DECIMAL(19,4) DEFAULT 0, 
  `BPaymnt_Com` LONGTEXT, 
  `BTrans_Count` INTEGER DEFAULT 0, 
  `BPrefix` VARCHAR(10), 
  `BStartNumber` INTEGER DEFAULT 0, 
  `BSuffix` VARCHAR(10), 
  `BCreated` TINYINT(1) DEFAULT 0, 
  `BAdvMethod` INTEGER DEFAULT 0, 
  INDEX (`BPayor_No`), 
  INDEX (`BTax_ID`), 
  PRIMARY KEY (`BatchNo`)
) ENGINE=myisam DEFAULT CHARSET=utf8;

INSERT INTO `BatchEntry` (`BatchNo`, `BatchDate`, `BTax_ID`, `BPayor_No`, `BBroker_No`, `BHam_Cont`, `BInv_Org_Date`, `BInv_Due_Date`, `BDate_Adv`, `BRec_Amt`, `BPaymnt_Com`, `BTrans_Count`, `BPrefix`, `BStartNumber`, `BSuffix`, `BCreated`, `BAdvMethod`) VALUES (1396, '1936-01-31 00:00:00', 561986585, 4528, 749, 'BSR', '2005-12-30 00:00:00', '2006-01-30 00:00:00', '2006-01-31 00:00:00', 0, NULL, 14, 'MC', 24850, NULL, 1, 1);

1 ответов


Batchdate-это не столбец DATETIME, а столбец TIMESTAMP. Диапазон для метки времени не включает эту дату:

CREATE TABLE `BatchEntry` (
  `BatchNo` INTEGER NOT NULL AUTO_INCREMENT, 
  `BatchDate` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    -- it's TIMESTAMP

сообщение об ошибке

неверное значение datetime: '1936-01-31 00:00:00'

это старше, чем '1970-01-01 00:00: 01', вне диапазона типа данных TIMESTAMP

типы даты, времени и метки времени

тип данных TIMESTAMP используется для значения, которые содержат дату и части времени. Метка времени имеет диапазон от '1970-01-01 00:00:01' UTC в '2038-01-19 03:14:07' UTC.

решение

измените тип данных на DATETIME.

CREATE TABLE `BatchEntry` (
  `BatchNo` INTEGER NOT NULL AUTO_INCREMENT, 
  `BatchDate` DATETIME DEFAULT CURRENT_TIMESTAMP, 
  [...]

если вы используете MySQL 5.6.5 или новее, вы можете изменить тип данных на DATETIME, потому что, поскольку эта версия DATETIME поддерживает автоматическую инициализацию. Кажется, вы используете более новую версию, так как вы используете более одной такой столбец с автоматической инициализацией. Эта функция была добавлена одновременно.

автоматическая Инициализация и обновление для TIMESTAMP и DATETIME

начиная с MySQL 5.6.5, TIMESTAMP и DATETIME столбцы могут быть автоматически initializated и обновлен до текущей даты и времени (то есть текущая отметка времени). До 5.6.5 это справедливо только для метки времени, и на один столбец timestamp в таблица.

Примечание

для значений дат в 1970-х годах он тоже будет работать.