ทั้ง DATETIME และ TIMESTAMP ใช้เก็บวันที่และเวลา แต่มีความแตกต่างสำคัญที่ส่งผลต่อการเลือกใช้
ตารางเปรียบเทียบ
| คุณสมบัติ | DATETIME | TIMESTAMP |
|---|---|---|
| ช่วงค่า (Range) | 1000-01-01 ถึง 9999-12-31 | 1970-01-01 ถึง 2038-01-19 (Year 2038 problem) |
| พื้นที่จัดเก็บ | 8 ไบต์ | 4 ไบต์ |
| Timezone | ไม่เก็บ Timezone (เก็บค่าที่ป้อนเข้าไป) | แปลงเป็น UTC ตอนเก็บ, แปลงกลับตอนอ่าน ตาม Timezone ของ Session |
| Default Value | ไม่มี (ต้องระบุ) | สามารถตั้ง DEFAULT CURRENT_TIMESTAMP ได้ |
| Auto Update | ไม่รองรับ | รองรับ ON UPDATE CURRENT_TIMESTAMP |
| Index Performance | ช้ากว่าเล็กน้อย | เร็วกว่า (ขนาดเล็กกว่า) |
ตัวอย่างการใช้งาน TIMESTAMP
CREATE TABLE TimeStampDemo (
MyDataTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO TimeStampDemo VALUES (NOW());
SELECT * FROM TimeStampDemo;
-- ผลลัพธ์: 2018-10-11 17:30:38 (ขึ้นอยู่กับ Timezone ของ Server/Session)
แนวทางเลือกใช้
- ใช้ TIMESTAMP เมื่อ:
- ต้องการติดตามเวลาสร้าง/แก้ไขอัตโนมัติ (created_at, updated_at)
- แอปพลิเคชันทำงานหลาย Timezone (เก็บเป็น UTC แปลงให้อัตโนมัติ)
- ข้อมูลอยู่ในช่วง 1970-2038
- ใช้ DATETIME เมื่อ:
- ข้อมูลนอกช่วง TIMESTAMP (ก่อน 1970 หรือหลัง 2038)
- ต้องการเก็บเวลาที่แน่นอน ไม่ให้แปลง Timezone (เช่น วันเกิด, วันครบรอบ)
- ต้องการช่วงวันที่กว้าง (ถึงปี 9999)
หมายเหตุ MySQL 8.0+
รองรับ DATETIME(6) และ TIMESTAMP(6) สำหรับ Microsecond Precision (ความแม่นยำไมโครวินาที)