ทั้งสองชนิดข้อมูลเก็บข้อมูลในรูปแบบ "YYYY-MM-DD HH:MM:SS" และรวมวันที่กับเวลา แต่มีความแตกต่างดังนี้:
- Range (ช่วง) - DATETIME: 1000-01-01 00:00:00 ถึง 9999-12-31 23:59:59. TIMESTAMP: '1970-01-01 00:00:01' ถึง '2038-01-19 08:44:07'
- Size (ขนาด) - DATETIME: 5 ไบต์ + 3 ไบต์สำหรับ fractional seconds. TIMESTAMP: 4 ไบต์ + 3 ไบต์สำหรับ fractional seconds. ก่อน MySQL 5.6.4 DATETIME ใช้ 8 ไบต์
- Timezone Conversion - MySQL 5+ TIMESTAMP แปลงจากเวลาปัจจุบันเป็น UTC และกลับกัน DATETIME ไม่แปลง
- Indexing - TIMESTAMP สามารถสร้างดัชนีได้ DATETIME ไม่สามารถ
- Query Caching - คิวรี่ที่มี TIMESTAMP สามารถแคชได้ DATETIME ไม่สามารถ
ตัวอย่าง
mysql> CREATE TABLE test_datetime(time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); mysql> INSERT INTO test_datetime (time) VALUES (CURRENT_TIMESTAMP); mysql> SELECT * FROM test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+ mysql> CREATE TABLE test_timestamp(time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); mysql> INSERT INTO test_timestamp (time) VALUES (CURRENT_TIMESTAMP); mysql> SELECT * FROM test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:50 | +---------------------+
เปลี่ยน timezone เป็น UTC-05:00 ผลลัพธ์ของ TIMESTAMP เปลี่ยนแต่ DATETIME ไม่เปลี่ยน:
mysql> SET @@session.time_zone = '-5:00'; mysql> SELECT * FROM test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 06:59:50 | +---------------------+ mysql> SELECT * FROM test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+