Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ดึงข้อมูลที่อัปเดตเก่ากว่า 1 วันใน MySQL ด้วย FROM_UNIXTIME

สถานการณ์: 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 Timezone
  • UTC_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 ชัดเจนกว่า