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

MySQL: ดึงข้อมูลปีเฉพาะจาก Timestamp ด้วย YEAR()

ใน MySQL สามารถดึงเฉพาะส่วน ปี (Year) จากคอลัมน์ TIMESTAMP, DATETIME, หรือ DATE ได้ง่ายด้วยฟังก์ชัน YEAR()

รูปแบบคำสั่ง

SELECT column_name
FROM table_name
WHERE YEAR(timestamp_column) = 'target_year';

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

1. สร้างตารางพร้อมคอลัมน์ TIMESTAMP

CREATE TABLE getYearOut (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(10),
    yourTimestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (Id)
);

2. เพิ่มข้อมูลหลายปี

INSERT INTO getYearOut (Name, yourTimestamp) VALUES
('John', NOW()),                    -- ปีปัจจุบัน
('Carol', '2018-09-23 17:34:44'),   -- ปี 2018
('Bob', '2016-05-12 16:12:34');     -- ปี 2016

ข้อมูลในตาราง:

+----+-------+---------------------+
| Id | Name  | yourTimestamp       |
+----+-------+---------------------+
|  1 | John  | 2019-02-05 11:46:11 |
|  2 | Carol | 2018-09-23 17:34:44 |
|  3 | Bob   | 2016-05-12 16:12:34 |
+----+-------+---------------------+

3. ดึงข้อมูลปี 2019

SELECT Id, Name
FROM getYearOut
WHERE YEAR(yourTimestamp) = '2019';

ผลลัพธ์:

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
+----+-------+

ฟังก์ชันแยกส่วนวันที่/เวลาอื่นๆ

ฟังก์ชันคืนค่าตัวอย่าง
YEAR(date)ปี (4 หลัก)2019
MONTH(date)เดือน (1-12)2
DAY(date)วัน (1-31)4
HOUR(time)ชั่วโมง (0-23)12
MINUTE(time)นาที (0-59)56
SECOND(time)วินาที (0-59)50
DATE(date)ส่วนวันที่อย่างเดียว2019-02-04
TIME(date)ส่วนเวลาอย่างเดียว12:56:50
QUARTER(date)ไตรมาส (1-4)1
WEEK(date)สัปดาห์ในปี (0-53)5

ตัวอย่าง: แยกหลายส่วนพร้อมกัน

SELECT 
    Name,
    YEAR(yourTimestamp) AS yr,
    MONTH(yourTimestamp) AS mo,
    DAY(yourTimestamp) AS dy,
    HOUR(yourTimestamp) AS hr
FROM getYearOut;

ประสิทธิภาพและ Index

คำเตือน: การใช้ฟังก์ชันบนคอลัมน์ใน WHERE (WHERE YEAR(col) = 2019) จะทำให้ ไม่สามารถใช้ Index ได้ (Non-SARGable)

วิธีแก้: ใช้ Range Query แทน

-- แทน WHERE YEAR(ts) = 2019
WHERE ts >= '2019-01-01 00:00:00' 
  AND ts < '2020-01-01 00:00:00';

วิธีนี้ใช้ Index บนคอลัมน์ timestamp ได้เต็มที่