การเปรียบเทียบเฉพาะส่วนวันที่ของ 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) และเร็วกว่ามาก