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

ค้นหาข้อมูลใน MySQL ตามส่วนของ Timestamp (ปี, เดือน, วัน)

ภาพรวม

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