สถานการณ์: Timestamp เก็บเป็น Unix Timestamp (INT)
ตัวอย่าง: ตาราง demo75
CREATE TABLE demo75 (due_date INT(11));
INSERT INTO demo75 VALUES
(UNIX_TIMESTAMP('2020-01-10')),
(UNIX_TIMESTAMP('2020-11-19')),
(UNIX_TIMESTAMP('2020-12-18')),
(UNIX_TIMESTAMP('2020-11-10'));
ข้อมูล (Unix Timestamp)
+------------+ | due_date | +------------+ | 1578594600 | | 1605724200 | | 1608229800 | | 1604946600 | +------------+
คำสั่ง: หาแถวที่ due_date เก่ากว่า "ตอนนี้ - 1 วัน"
SELECT * FROM demo75 WHERE FROM_UNIXTIME(due_date) < NOW() - INTERVAL 1 DAY;
ผลลัพธ์ (สมมติ NOW = 2020-12-19)
+------------+ | due_date | +------------+ | 1578594600 | -- 2020-01-10 | 1604946600 | -- 2020-11-10 +------------+
2020-11-19 และ 2020-12-18 อยู่ในช่วง 1 วันล่าสุด → ถูกตัดออก
ฟังก์ชันที่ใช้
| ฟังก์ชัน | คำอธิบาย |
|---|---|
| FROM_UNIXTIME(unix_ts) | แปลง Unix Timestamp → DATETIME |
| UNIX_TIMESTAMP(date) | แปลง DATETIME → Unix Timestamp |
| NOW() | วันเวลาปัจจุบัน (Session Timezone) |
| INTERVAL 1 DAY | ช่วงเวลา 1 วัน |
วิธีอื่น: คำนวณใน Unix Time (เร็วกว่า)
SELECT * FROM demo75 WHERE due_date < UNIX_TIMESTAMP(NOW() - INTERVAL 1 DAY);
- ไม่ต้องแปลงทุกแถว (No Function on Column)
- ใช้ INDEX บน due_date ได้ (SARGable)
- แนะนำสำหรับ Production
รูปแบบ INTERVAL อื่นๆ
NOW() - INTERVAL 1 HOUR NOW() - INTERVAL 30 MINUTE NOW() - INTERVAL 7 DAY NOW() - INTERVAL 1 MONTH NOW() - INTERVAL 1 YEAR
Timezone Considerations
NOW()ใช้ Session TimezoneUTC_TIMESTAMP()ใช้ UTC- Unix Timestamp เป็น UTC เสมอ — ต้องระวัง Timezone Mismatch
- แนะนำ: เก็บเป็น
DATETIMEหรือTIMESTAMPแทน INT
Best Practice: Schema Design
CREATE TABLE events (
id BIGINT PRIMARY KEY,
event_time DATETIME NOT NULL, -- หรือ TIMESTAMP
INDEX idx_event_time (event_time)
);
Query:
SELECT * FROM events WHERE event_time < NOW() - INTERVAL 1 DAY;
- ใช้ INDEX ได้
- ไม่ต้อง Convert Function
- Timezone Handling ชัดเจนกว่า