การเปรียบเทียบ DateTime และคำนวณความต่างวันระหว่าง 2 คอลัมน์
ใช้ DATEDIFF(date1, date2) หาความต่างวัน (date1 - date2) ร่วมกับการหารเพื่อแปลงเป็นปี
Syntax
SELECT *, DATEDIFF(end_date, start_date) AS days_diff FROM table_name WHERE (DATEDIFF(end_date, start_date) / 365) > years_threshold;
ตัวอย่าง: หาคนอายุเกิน 23 ปี (DOB vs CurrentDate)
สร้างตาราง DOB และ CurrentDate:
mysql> CREATE TABLE DemoTable (DOB DATETIME, CurrentDate DATETIME);
Query OK, 0 rows affected (0.59 sec)
mysql> INSERT INTO DemoTable VALUES
('1995-01-21', CURDATE()),
('1998-11-01', CURDATE()),
('2000-10-24', CURDATE());
Query OK, 3 rows affected
ข้อมูล (สมมติ CURDATE() = '2019-07-08'):
mysql> SELECT * FROM DemoTable;
+---------------------+---------------------+ | DOB | CurrentDate | +---------------------+---------------------+ | 1995-01-21 00:00:00 | 2019-07-08 00:00:00 | | 1998-11-01 00:00:00 | 2019-07-08 00:00:00 | | 2000-10-24 00:00:00 | 2019-07-08 00:00:00 | +---------------------+---------------------+ 3 rows in set (0.00 sec)
คิวรี่หาอายุ > 23 ปี:
mysql> SELECT * FROM DemoTable WHERE (DATEDIFF(CurrentDate, DOB) / 365) > 23;
+---------------------+---------------------+ | DOB | CurrentDate | +---------------------+---------------------+ | 1995-01-21 00:00:00 | 2019-07-08 00:00:00 | +---------------------+---------------------+ 1 row in set (0.00 sec)
เฉพาะคนเกิด 1995-01-21 (อายุ ~24.5 ปี) ผ่านเกณฑ์
ฟังก์ชันที่แม่นยำกว่า: TIMESTAMPDIFF
-- หาอายุในปี (แม่นยำกว่าหาร 365) SELECT TIMESTAMPDIFF(YEAR, DOB, CurrentDate) AS age FROM DemoTable; -- หาความต่างในหน่วยต่างๆ TIMESTAMPDIFF(DAY, dt1, dt2) TIMESTAMPDIFF(MONTH, dt1, dt2) TIMESTAMPDIFF(HOUR, dt1, dt2)
ข้อแตกต่าง DATEDIFF vs TIMESTAMPDIFF
| ฟังก์ชัน | คืนค่า | หน่วย | แม่นยำ |
|---|---|---|---|
| DATEDIFF(d1, d2) | Integer (Days) | Day Only | ไม่รวม Time |
| TIMESTAMPDIFF(unit, d1, d2) | Integer | YEAR/MONTH/DAY/HOUR/... | รวม Time, คำนวณ Year/Month ถูกต้อง |
Index และ Performance
WHERE DATEDIFF(col, '2019-01-01') > 100→ **ไม่ใช้ Index** (Function on Column)- เขียนใหม่เป็น Range:
WHERE col < DATE_SUB('2019-01-01', INTERVAL 100 DAY)→ **ใช้ Index ได้**