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

เปรียบเทียบ DateTime และหาความต่างวันระหว่างคอลัมน์ใน MySQL ด้วย DATEDIFF

การเปรียบเทียบ 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)IntegerYEAR/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 ได้**