TIMESTAMP型とDATETIME型

MySQLの仕様


MySQLの日付をあらわす型にはTIMESTAMP型とDATETIME型があります。(DATE型もありますが…)


詳しくはMySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型に記載されてます。


で、今日はじめて知った事↓

サポート範囲
TIMESTAMP '1970-01-01 00:00:00' 〜 2037 年の一定の時点
DATETIME '1000-01-01 00:00:00' 〜 '9999-12-31 23:59:59'
消費バイト数
TIMESTAMP 4バイト
DATETIME 8バイト

MySQLのTIMESTAMP型は、4バイトで保持できる一定の期間しか保持できないんですね。

試しに

  • TIMESTAMP型とDATETIME型のカラムを持つテストテーブルを作る。
CREATE TABLE `date_test` (
  `timestamp1` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `datetime1` datetime default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 今日の日付でInsert
INSERT INTO date_test VALUES
(
20081119000000,
20081119000000
);

Query OK, 1 row affected (0.02 sec)
  • 2999年でInsert
INSERT INTO date_test VALUES
(
20990101000000,
20081119000000
);

ERROR 1292 (22007): Incorrect datetime value: '20990101000000' for column 'timestamp1' at row 1                     
  • いつからいつまでInsertできるか検証
INSERT INTO date_test VALUES
(
20380119000000,
20081119000000
);

Query OK, 1 row affected (0.01 sec)


あれ!?(今日の日付は2008年11月19日)

INSERT INTO date_test VALUES
(
20380120000000,
20081119000000
);

ERROR 1292 (22007): Incorrect datetime value: '20380120000000' for column 'timestamp1' at row 1

INSERT INTO date_test VALUES
(
19700101000000,
20081119000000
);

ERROR 1292 (22007): Incorrect datetime value: '19700101000000' for column 'timestamp1' at row 1


INSERT INTO date_test VALUES
(
19700102000000,
20081119000000
);


Query OK, 1 row affected (0.01 sec)


なぜかわからない??
ロケールとか、SQLモードのせいなんでしょうか??

まとめ


いつからいつまで挿入可能なのかはこれからの課題。
SQL92で定義されているのは TIMESTAMP型のみのようですが、MySQLのTIMESTAMP型は特殊なようです。
MySQLではDATETIME型を使ったほうがよさそう。