ภาพรวม
MySQL มีฟังก์ชันสำหรับดึงส่วนต่างๆ ของ DATE/TIMESTAMP เช่น YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND() ใช้ใน WHERE เพื่อกรองข้อมูลตามส่วนที่ต้องการ
ฟังก์ชันสำคัญ
| ฟังก์ชัน | คืนค่า | ตัวอย่าง |
|---|---|---|
| YEAR(date) | ปี (4 หลัก) | 2019 |
| MONTH(date) | เดือน (1-12) | 7 |
| DAY(date) | วัน (1-31) | 15 |
| HOUR(time) | ชั่วโมง (0-23) | 14 |
| MINUTE(time) | นาที (0-59) | 30 |
| SECOND(time) | วินาที (0-59) | 45 |
| DAYOFWEEK(date) | วันในสัปดาห์ (1=อาทิตย์) | 2 |
| QUARTER(date) | ไตรมาส (1-4) | 3 |
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (AdmissionDate TIMESTAMP);
INSERT INTO DemoTable VALUES ('2007-01-10');
INSERT INTO DemoTable VALUES ('2015-07-12');
INSERT INTO DemoTable VALUES ('2017-11-01');
INSERT INTO DemoTable VALUES ('2019-08-29');
2. ข้อมูลทั้งหมด
SELECT * FROM DemoTable;
+---------------------+
| AdmissionDate |
+---------------------+
| 2007-01-10 00:00:00 |
| 2015-07-12 00:00:00 |
| 2017-11-01 00:00:00 |
| 2019-08-29 00:00:00 |
+---------------------+
3. ค้นหาปี 2017
SELECT * FROM DemoTable WHERE YEAR(AdmissionDate) = '2017';
+---------------------+
| AdmissionDate |
+---------------------+
| 2017-11-01 00:00:00 |
+---------------------+
4. ตัวอย่างเพิ่มเติม
-- เดือน สิงหาคม (8)
SELECT * FROM DemoTable WHERE MONTH(AdmissionDate) = 8;
-- วันที่ 10 ของเดือนไหนก็ได้
SELECT * FROM DemoTable WHERE DAY(AdmissionDate) = 10;
-- ปี 2018-2019 (Range)
SELECT * FROM DemoTable WHERE YEAR(AdmissionDate) BETWEEN 2018 AND 2019;
-- วันสุดสัปดาห์ (เสาร์=7, อาทิตย์=1)
SELECT * FROM DemoTable WHERE DAYOFWEEK(AdmissionDate) IN (1, 7);
ประสิทธิภาพและ Index
⚠️ ข้อควรระวัง: การใช้ Function บนคอลัมน์ใน WHERE (เช่น YEAR(date_col) = 2017) จะทำให้ Index ไม่ถูกใช้งาน (Non-SARGable)
วิธีแก้: ใช้ Range Query แทน
-- ❌ ช้า: ไม่ใช้ Index
SELECT * FROM DemoTable WHERE YEAR(AdmissionDate) = 2017;
-- ✅ เร็ว: ใช้ Index ได้
SELECT * FROM DemoTable
WHERE AdmissionDate >= '2017-01-01'
AND AdmissionDate < '2018-01-01';
MySQL 8.0+: Functional Index
CREATE INDEX idx_year ON DemoTable ((YEAR(AdmissionDate)));
-- แล้ว YEAR(AdmissionDate) = 2017 จะใช้ Index ได้
สรุป
- ใช้
YEAR(),MONTH(),DAY()เพื่อกรองตามส่วนของวันที่ - สำหรับตารางใหญ่ ใช้ Range Query (
BETWEENหรือ>= AND <) เพื่อให้ Index ทำงาน - MySQL 8.0+ สร้าง Functional Index ได้เพื่อรองรับ Query แบบ Function-based