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

MySQL: เปรียบเทียบ Timestamp ด้วย DATE()

การเปรียบเทียบเฉพาะส่วนวันที่ของ TIMESTAMP ด้วย DATE()

คอลัมน์ TIMESTAMP เก็บทั้งวันที่และเวลา หากต้องการเปรียบเทียบเฉพาะวันที่ (เว้นเวลา) ให้ใช้ฟังก์ชัน DATE() ดึงส่วนวันที่ออกมา ก่อนเปรียบเทียบ

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่ม Timestamp:

mysql> CREATE TABLE comparingTimestampDemo (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> AdmissionDate TIMESTAMP
    -> );
Query OK, 0 rows affected (0.54 sec)

mysql> INSERT INTO comparingTimestampDemo(AdmissionDate) VALUES('2019-03-31'),('2019-04-10'),('2019-04-15'),('2019-03-29'),('2019-04-07');
Query OK, 5 rows affected (0.15 sec)

ข้อมูล (แสดงเป็น Datetime 00:00:00):

mysql> SELECT * FROM comparingTimestampDemo;
+----+---------------------+
| Id | AdmissionDate       |
+----+---------------------+
| 1  | 2019-03-31 00:00:00 |
| 2  | 2019-04-10 00:00:00 |
| 3  | 2019-04-15 00:00:00 |
| 4  | 2019-03-29 00:00:00 |
| 5  | 2019-04-07 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)

หาวันที่ที่มาก่อนวันนี้ 3 วัน (สมมติวันนี้ 2019-04-11):

mysql> SELECT DATE(`AdmissionDate`) FROM comparingTimestampDemo
    -> WHERE DATE(`AdmissionDate`) < CURDATE() - INTERVAL 3 DAY;
+-----------------------+
| DATE(`AdmissionDate`) |
+-----------------------+
| 2019-03-31            |
| 2019-03-29            |
+-----------------------+
2 rows in set (0.00 sec)

คำอธิบาย

  • DATE(AdmissionDate) ดึงเฉพาะส่วน Date (ตัดเวลา 00:00:00 ออก)
  • CURDATE() วันที่ปัจจุบัน (ไม่มีเวลา)
  • INTERVAL 3 DAY ลบ 3 วันจากวันนี้
  • การเปรียบเทียบ < ระหว่าง DATE กับ DATE ทำงานถูกต้อง

วิธีอื่นที่เทียบเท่า

-- ใช้ DATE() ทั้งสองข้าง
WHERE DATE(AdmissionDate) < DATE_SUB(CURDATE(), INTERVAL 3 DAY)

-- ใช้ Timestamp โดยตรง (ต้องคำนวณช่วงเวลาให้ครบวัน)
WHERE AdmissionDate < TIMESTAMP(CURDATE() - INTERVAL 3 DAY)

-- ใช้ BETWEEN สำหรับช่วง
WHERE DATE(AdmissionDate) BETWEEN '2019-03-01' AND '2019-03-31'

ข้อควรระวังเรื่อง Index

การใช้ DATE(column) ใน WHERE จะทำให้ Index บน column นั้น ไม่ถูกใช้งาน (Non-sargable) หากตารางใหญ่ ควรใช้ Range Query บน Timestamp โดยตรง:

WHERE AdmissionDate >= '2019-03-01' AND AdmissionDate < '2019-04-01'

วิธีนี้ใช้ Index ได้ (Sargable) และเร็วกว่ามาก