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

ดึงข้อมูลวันนี้จาก DATETIME ใน MySQL ด้วย DATE() และ DATE_SUB

เมื่อคอลัมน์เป็น DATETIME (มีทั้ง Date และ Time) ต้องการดึงเฉพาะข้อมูลวันนี้ ให้ใช้ DATE() แยกส่วนวันที่ หรือ DATE_SUB(CURDATE(), INTERVAL 1 DAY) สำหรับช่วง 24 ชม.

สร้างตารางมี ShippingDate (DATETIME)

mysql> create table DemoTable (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ShippingDate datetime
);

เพิ่มข้อมูล

mysql> insert into DemoTable(ShippingDate) values
('2019-03-01 05:45:32'),('2019-04-13 11:34:56'),
('2019-03-15 04:45:23'),('2019-04-11 12:10:02');

ข้อมูลในตาราง

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 1  | 2019-03-01 05:45:32 |
| 2  | 2019-04-13 11:34:56 |
| 3  | 2019-03-15 04:45:23 |
| 4  | 2019-04-11 12:10:02 |
+----+---------------------+

คำสั่ง: ดึงข้อมูลวันที่ 2019-04-13 (สมมติวันนี้)

mysql> select * from DemoTable 
where ShippingDate > date_sub(curdate(), interval 1 day);

ผลลัพธ์

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2019-04-13 11:34:56 |
+----+---------------------+

คำอธิบาย

  • CURDATE() = '2019-04-13' (สมมติ)
  • DATE_SUB(CURDATE(), INTERVAL 1 DAY) = '2019-04-12'
  • ShippingDate > '2019-04-12' → DATETIME > DATE → MySQL แปลง DATE เป็น '2019-04-12 00:00:00'
  • ดังนั้น ได้ข้อมูลจาก '2019-04-12 00:00:00' ถึง '2019-04-13 23:59:59'

วิธีอื่น: ใช้ DATE() แยกวันที่

-- เทียบเฉพาะ Date Part
SELECT * FROM DemoTable WHERE DATE(ShippingDate) = CURDATE();
  • อ่านง่าย แต่ ไม่ใช้ Index ได้ (Function on Column)

Best Practice: Range Query (SARGable - ใช้ Index ได้)

-- วันนี้ (Midnight to Midnight)
WHERE ShippingDate >= CURDATE()
  AND ShippingDate < CURDATE() + INTERVAL 1 DAY

-- หรือ DATE_SUB สำหรับ "24 ชม. ย้อนหลัง"
WHERE ShippingDate >= DATE_SUB(NOW(), INTERVAL 24 HOUR)

Index สำหรับ DATETIME Range

CREATE INDEX idx_shipping_date ON DemoTable(ShippingDate);

MySQL 8.0+ Functional Index สำหรับ DATE()

ALTER TABLE DemoTable 
ADD INDEX idx_shipping_date_only ((DATE(ShippingDate)));