web-dev-qa-db-ja.com

1980年より古い日付のMySQLの不正なDateTime値

.sqlファイルをデータベースにインポートしようとすると、挿入ステートメントの1つで次のエラーが発生します-

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

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の範囲外です。

DATE、DATETIME、およびTIMESTAMPタイプ

TIMESTAMPデータ型は、日付と時刻の両方の部分を含む値に使用されます。 TIMESTAMPの範囲は「1970-01-0100:00:01」UTCから「2038-01-1903: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列は自動的に初期化され、現在の日付と時刻(つまり、現在のタイムスタンプ)に更新されます。 5.6.5より前では、これはTIMESTAMPにのみ当てはまり、テーブルごとに最大1つのTIMESTAMP列に当てはまります。

1970年代の日付値の場合も機能します。

16
VMai