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

การคำนวณจำนวนวันระหว่างสองคอลัมน์วันที่ใน MySQL ด้วย DATEDIFF

เมื่อมีสองคอลัมน์วันที่ในแถวเดียวกัน (เช่น วันที่เข้า-ออกงาน, วันที่สั่ง-ส่ง) สามารถคำนวณความต่างวันได้โดยใช้ DATEDIFF(end_date, start_date) โดยตรงใน SELECT

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

สร้างตารางพนักงาน (เข้า-ออกงาน):

mysql> CREATE TABLE DemoTable1471 (
    -> EmployeeJoiningDate DATE,
    -> EmployeeRelievingDate DATE
    -> );

เพิ่มข้อมูล:

mysql> INSERT INTO DemoTable1471 VALUES ('2018-06-21', '2018-12-21');
mysql> INSERT INTO DemoTable1471 VALUES ('2017-01-19', '2019-01-31');
mysql> INSERT INTO DemoTable1471 VALUES ('2015-12-31', '2016-03-01');

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1471;
+---------------------+-----------------------+
| EmployeeJoiningDate | EmployeeRelievingDate |
+---------------------+-----------------------+
| 2018-06-21          | 2018-12-21            |
| 2017-01-19          | 2019-01-31            |
| 2015-12-31          | 2016-03-01            |
+---------------------+-----------------------+

คำนวณจำนวนวันทำงาน (Relieving - Joining):

mysql> SELECT DATEDIFF(EmployeeRelievingDate, EmployeeJoiningDate) AS EmployeeWorkDays
    -> FROM DemoTable1471;

ผลลัพธ์:

+------------------+
| EmployeeWorkDays |
+------------------+
|              183 |
|              742 |
|               61 |
+------------------+

รายละเอียด DATEDIFF

  • DATEDIFF(date1, date2) = date1 - date2 (คืนค่าวันเป็น SIGNED INT)
  • ใช้ได้กับ DATE, DATETIME, TIMESTAMP (ใช้ส่วนวันที่อย่างเดียว)
  • ค่าบวก = date1 มาหลัง date2, ค่าลบ = date1 มาก่อน date2

ฟังก์ชันวันที่ขั้นสูง

การประยุกต์ใช้

  • อายุงาน: DATEDIFF(relieving, joining) หรือ TIMESTAMPDIFF(YEAR, joining, CURDATE())
  • ระยะเวลาโปรเจค: DATEDIFF(end_date, start_date)
  • Lead Time: DATEDIFF(ship_date, order_date)
  • Overdue Days: DATEDIFF(CURDATE(), due_date) (ถ้า > 0 = เกินกำหนด)
  • Age: FLOOR(DATEDIFF(CURDATE(), birth_date) / 365.25)

ข้อควรระวัง

  • NULL Handling: หากคอลัมน์ไหนเป็น NULL → ผลลัพธ์ NULL → ใช้ COALESCE/IFNULL
  • Index: ไม่สามารถ Index ได้โดยตรง (Computed) → ใช้ Generated Column + Index หาก Query บ่อย
  • Leap Year: DATEDIFF คำนวณวันจริง รวม Feb 29 แล้ว
ฟังก์ชันคำอธิบายตัวอย่าง
TIMESTAMPDIFF(unit, d1, d2)ความต่างในหน่วยที่กำหนดTIMESTAMPDIFF(MONTH, start, end)
TIMESTAMPDIFF(DAY, d1, d2)เท่า DATEDIFF แต่ระบุหน่วยชัดเจนTIMESTAMPDIFF(DAY, '2019-01-01', '2019-01-31') = 30
DATEDIFF(d1, d2)ความต่างวัน (Simple)DATEDIFF('2019-01-31', '2019-01-01') = 30