คำนวณวันทำงาน/อายุงาน: DATEDIFF(CURDATE(), JoiningDate)
DATEDIFF(date1, date2) คืนค่า date1 - date2 เป็นจำนวนวัน (Integer) ใช้กับ DATE หรือ DATETIME
วันที่ปัจจุบัน (สมมติ)
mysql> SELECT CURDATE();
+------------+
| curdate() |
+------------+
| 2019-10-26 |
+------------+
สร้างตาราง: JoiningDate เก็บเป็น VARCHAR (รูปแบบ DD/MM/YYYY)
mysql> CREATE TABLE DemoTable (JoiningDate VARCHAR(40));
Query OK, 0 rows affected (0.61 sec)
mysql> INSERT INTO DemoTable VALUES
-> ('10/10/1998'), ('31/12/2010'), ('01/01/2017'), ('25/10/2019');
Query OK, 4 rows affected
ข้อมูลต้นฉบับ
+-------------+
| JoiningDate |
+-------------+
| 10/10/1998 |
| 31/12/2010 |
| 01/01/2017 |
| 25/10/2019 |
+-------------+
คำสั่ง: แปลง String → DATE ด้วย STR_TO_DATE แล้ว DATEDIFF
mysql> SELECT DATEDIFF(CURDATE(), STR_TO_DATE(JoiningDate, '%d/%m/%Y'))
-> FROM DemoTable;
ผลลัพธ์ (จำนวนวัน)
+---------------------------------------------------------+
| datediff(curdate(),str_to_date(JoiningDate,'%d/%m/%Y')) |
+---------------------------------------------------------+
| 7686 |
| 3221 |
| 1028 |
| 1 |
+---------------------------------------------------------+
คำอธิบาย
STR_TO_DATE(JoiningDate, '%d/%m/%Y') - Parse String 'DD/MM/YYYY' เป็น DATE
CURDATE() - วันที่ปัจจุบัน
DATEDIFF(date1, date2) - date1 - date2 (วัน)
Format Specifiers สำหรับ STR_TO_DATE
| Specifier | ความหมาย |
%d | วัน (01-31) |
%m | เดือน (01-12) |
%Y | ปี 4 หลัก |
%y | ปี 2 หลัก |
%H | ชั่วโมง 24h (00-23) |
%i | นาที (00-59) |
%s | วินาที (00-59) |
⚠️ Best Practice: เก็บวันที่เป็น DATE/DATETIME ไม่ใช่ VARCHAR
-- ดี: ใช้ DATE Type
CREATE TABLE Employee (
EmpId INT PRIMARY KEY,
JoiningDate DATE NOT NULL
);
-- Query เรียบง่าย ไม่ต้อง Parse
SELECT DATEDIFF(CURDATE(), JoiningDate) FROM Employee;
ฟังก์ชันวันที่อื่นที่เกี่ยวข้อง
| Function | คืนค่า | ตัวอย่าง |
DATEDIFF(d1, d2) | วัน (Integer) | DATEDIFF('2023-01-10', '2023-01-01') = 9 |
TIMESTAMPDIFF(UNIT, d1, d2) | หน่วยที่ระบุ | TIMESTAMPDIFF(YEAR, '2010-01-01', '2023-01-01') = 13 |
TIMESTAMPDIFF(MONTH, d1, d2) | เดือน | ... |
TIMESTAMPDIFF(DAY, d1, d2) | วัน (เหมือน DATEDIFF แต่สลับ Argument) | TIMESTAMPDIFF(DAY, '2023-01-01', '2023-01-10') = 9 |