【问题标题】:MySQL Incorrect DateTime Value for Date older than 1980MySQL 早于 1980 年的日期的 DateTime 值不正确
【发布时间】:2014-10-04 17:28:42
【问题描述】:

在尝试将 .sql 文件导入我的数据库时,我收到以下插入语句之一的错误 -

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 导入转储时发生。如果我单独执行该语句,它工作正常。这是表结构和插入语句

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);

【问题讨论】:

    标签: mysql timestamp mysqlimport


    【解决方案1】:

    Batchdate 不是 DATETIME 列,而是 TIMESTAMP 列。 TIMESTAMP 的范围不包括此日期:

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

    错误信息是

    不正确的日期时间值:'1936-01-31 00:00:00'

    早于“1970-01-01 00:00:01”,超出数据类型TIMESTAMP的范围

    The DATE, DATETIME, and TIMESTAMP Types

    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,因为这个版本也支持自动初始化。您似乎使用了较新的版本,因为您使用了多个具有自动初始化功能的此类列。此功能是同时添加的。

    Automatic Initialization and Updating for TIMESTAMP and DATETIME

    从 MySQL 5.6.5 开始,TIMESTAMP 和 DATETIME 列可以自动 初始化并更新为当前日期和时间(即 当前时间戳)。在 5.6.5 之前,这仅适用于 TIMESTAMP,并且 每个表最多有一个 TIMESTAMP 列。

    注意

    对于 1970 年代的日期值,它也可以工作。

    【讨论】:

    • 非常感谢。有用!!但是,当我只执行语句时它起作用并且在导入转储时不起作用的事实背后的解释是什么。
    • 如果您正在执行单个命令,您会收到一条警告消息,如果您选择该行,您会发现有特殊值 '0000-00-00 00:00: 00' 表示无效值:无效的 DATE、DATETIME 或 TIMESTAMP 值被转换为适当类型的“零”值('0000-00-00' 或 '0000-00-00 00:00: 00')。来自The DATE, DATETIME, and TIMESTAMP Types
    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多