- 1 1. Introduction
- 2 2. How to Retrieve the Current Time in MySQL
- 3 3. How to Format the Current Time in MySQL
- 4 4. การคำนวณวันที่/เวลาโดยใช้เวลาปัจจุบันใน MySQL
- 5 5. การตั้งค่าเขตเวลาของ MySQL
- 6 6. วิธีตั้งค่าเวลาปัจจุบันเป็นค่าเริ่มต้นใน MySQL
- 7 7. ข้อผิดพลาดทั่วไปของ MySQL และวิธีแก้ไข (FAQ)
- 8 8. แนวปฏิบัติที่ดีที่สุดสำหรับการจัดการเวลาปัจจุบันใน MySQL
1. Introduction
เมื่อใดที่คุณต้องจัดการกับเวลาปัจจุบันใน MySQL?
ใน MySQL การดึงเวลาปัจจุบันเป็นสิ่งที่จำเป็นในหลายสถานการณ์ ตัวอย่างเช่น กรณีการใช้งานต่อไปนี้เป็นที่พบบ่อย:
- แทรก timestamp โดยอัตโนมัติเมื่อบันทึกข้อมูล
- ตัวอย่างเช่น การบันทึกวันที่และเวลาที่สร้างเมื่อบันทึกข้อมูลคำสั่งซื้อหรือข้อมูลบันทึกเหตุการณ์
- กรองข้อมูลตามเวลาปัจจุบัน
- ตัวอย่างเช่น การดึงข้อมูลเฉพาะจาก 7 วันที่ผ่านมา หรือการค้นหาบันทึกที่มีวันที่ในอนาคต
- จัดรูปแบบวันที่และเวลาเพื่อแสดงผล
- การจัดรูปแบบค่าวันที่และเวลาให้อ่านง่ายขึ้นเมื่อสร้างรายงาน
- จัดการการหมดอายุของข้อมูลโดยใช้เวลาปัจจุบัน
- ตัวอย่างเช่น การตรวจสอบว่าคูปองยังคงใช้ได้หรือไม่โดยเปรียบเทียบกับเวลาปัจจุบัน
ดังที่คุณเห็น การดึงและจัดการเวลาปัจจุบันใน MySQL อย่างถูกต้องเป็นทักษะสำคัญในการจัดการฐานข้อมูล
สิ่งที่คุณจะได้เรียนรู้ในบทความนี้
บทความนี้อธิบายหัวข้อต่อไปนี้อย่างละเอียด:
- วิธีดึงเวลาปัจจุบันใน MySQL (
NOW(),CURRENT_TIMESTAMPเป็นต้น) - วิธีเปลี่ยนรูปแบบวันที่และเวลา (โดยใช้
DATE_FORMAT()) - การคำนวณวันที่และเวลาโดยอิงเวลาปัจจุบัน (โดยใช้
INTERVAL) - วิธีเปลี่ยนโซนเวลา (
SET SESSION time_zone) - การใช้เวลาปัจจุบันเป็นค่าเริ่มต้น (
CURRENT_TIMESTAMP) - ข้อผิดพลาดทั่วไปและวิธีแก้ไข (FAQ)
ตั้งแต่พื้นฐานจนถึงการใช้งานขั้นสูงของการจัดการ “เวลาปัจจุบัน” ใน MySQL คู่มือนี้ให้ตัวอย่าง SQL ที่ใช้งานได้จริง อย่าลืมอ่านจนจบ
2. How to Retrieve the Current Time in MySQL
List of Functions to Retrieve the Current Time in MySQL
MySQL มีฟังก์ชันหลายตัวสำหรับดึงเวลาปัจจุบัน เข้าใจความแตกต่างและใช้ให้เหมาะสม
| Function | Returns | Example |
|---|---|---|
NOW() | Current date and time (date + time) | SELECT NOW(); → 2025-02-11 16:00:00 |
CURRENT_TIMESTAMP | Same as NOW() (SQL standard) | SELECT CURRENT_TIMESTAMP; |
CURDATE() | Current date only | SELECT CURDATE(); → 2025-02-11 |
CURTIME() | Current time only | SELECT CURTIME(); → 16:00:00 |
NOW() Function
NOW() เป็นฟังก์ชันที่ใช้บ่อยที่สุดใน MySQL เพื่อดึงเวลาปัจจุบัน
มันจะคืนค่าทั้งวันที่และเวลา
SELECT NOW();
ตัวอย่างผลลัพธ์:
2025-02-11 16:00:00
NOW()คืนค่าเวลาของระบบในขณะนั้น- เนื่องจากได้รับผลกระทบจากโซนเวลา เวลาแสดงผลอาจแตกต่างกันไปตามสภาพแวดล้อมของคุณ (อธิบายรายละเอียดในส่วน “การตั้งค่าโซนเวลา”)
How to Use CURRENT_TIMESTAMP
CURRENT_TIMESTAMP ทำงานเกือบเหมือนกับ NOW() มาตรฐานตาม SQL และสามารถใช้ในฐานข้อมูลอื่นได้เช่นกัน
SELECT CURRENT_TIMESTAMP;
ตัวอย่างผลลัพธ์:
2025-02-11 16:00:00
Get Only the Date with CURDATE()
CURDATE() ใช้เมื่อคุณต้องการดึงเฉพาะวันที่ปัจจุบัน (ปี, เดือน, วัน)
SELECT CURDATE();
ตัวอย่างผลลัพธ์:
2025-02-11
Get Only the Time with CURTIME()
หากต้องการดึงเฉพาะเวลาปัจจุบัน (ชั่วโมง, นาที, วินาที) ให้ใช้ CURTIME()
SELECT CURTIME();
ตัวอย่างผลลัพธ์:
16:00:00
Which Function Should You Use?
| Purpose | Recommended Function |
|---|---|
| Retrieve both date and time | NOW() or CURRENT_TIMESTAMP |
| Retrieve date only | CURDATE() |
| Retrieve time only | CURTIME() |
3. How to Format the Current Time in MySQL
Custom Formatting with DATE_FORMAT()
Basic Syntax of DATE_FORMAT()
ใน MySQL คุณสามารถใช้ฟังก์ชัน DATE_FORMAT() เพื่อเปลี่ยนรูปแบบของวันที่และเวลาได้อย่างอิสระ
SELECT DATE_FORMAT(datetime_value, 'format_specifiers');
ตัวอย่าง: แปลง NOW() ให้เป็นรูปแบบ YYYY/MM/DD HH:MM
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
ผลลัพธ์:
2025/02/11 16:45
List of Common Format Specifiers
| Specifier | Meaning | Example (2025-02-11 16:45:30) |
|---|---|---|
%Y | 4-digit year | 2025 |
%m | 2-digit month (01-12) | 02 |
%d | 2-digit day (01-31) | 11 |
%H | Hour (00-23, 24-hour format) | 16 |
%i | Minutes (00-59) | 45 |
%s | Seconds (00-59) | 30 |
Extract Only the Time Part with TIME()
หากต้องการดึง เฉพาะส่วนเวลา จาก datetime ที่ NOW() คืนค่า ให้ใช้ฟังก์ชัน TIME()
SELECT TIME(NOW());
ผลลัพธ์:
16:45:30
Extract Parts with YEAR(), MONTH(), and DAY()
เพื่อดึงส่วนเฉพาะของวันที่ ให้ใช้ฟังก์ชันต่อไปนี้
| Function | Returns | SQL | Output Example (2025-02-11 16:45:30) |
|---|---|---|---|
YEAR() | Year | SELECT YEAR(NOW()); | 2025 |
MONTH() | Month | SELECT MONTH(NOW()); | 2 |
DAY() | Day | SELECT DAY(NOW()); | 11 |
Practical Examples of Formatting
SQL ต่อไปนี้มีประโยชน์สำหรับการทดลองรูปแบบต่างๆ ในทางปฏิบัติ
SELECT
NOW() AS 'Original datetime',
DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
TIME(NOW()) AS 'Time only',
YEAR(NOW()) AS 'Year',
MONTH(NOW()) AS 'Month',
DAY(NOW()) AS 'Day';

4. การคำนวณวันที่/เวลาโดยใช้เวลาปัจจุบันใน MySQL
การบวก/ลบด้วย INTERVAL
ไวยากรณ์พื้นฐาน
SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;
การบวกเวลาตาม NOW()
ตัวอย่างเช่น เพื่อดึง datetime “หนึ่งสัปดาห์ถัดไป”:
SELECT NOW() + INTERVAL 7 DAY;
ตัวอย่างผลลัพธ์:
2025-02-18 16:30:00
| Unit | Meaning | Example |
|---|---|---|
| SECOND | Seconds | NOW() + INTERVAL 10 SECOND |
| MINUTE | Minutes | NOW() + INTERVAL 5 MINUTE |
| HOUR | Hours | NOW() + INTERVAL 2 HOUR |
| DAY | Days | NOW() + INTERVAL 10 DAY |
| MONTH | Months | NOW() + INTERVAL 3 MONTH |
คำนวณความแตกต่างระหว่างวันที่สองวันที่ด้วย DATEDIFF()
SELECT DATEDIFF(NOW(), '2025-01-01');
ตัวอย่างผลลัพธ์:
30
การกรองตามช่วงวันที่ด้วย BETWEEN
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
5. การตั้งค่าเขตเวลาของ MySQL
ตรวจสอบเขตเวลาปัจจุบัน
SHOW VARIABLES LIKE '%time_zone%';
ตัวอย่างผลลัพธ์:
+------------------+----------------+
| Variable_name | Value |
+------------------+----------------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+----------------+
เปลี่ยนเขตเวลาต่อเซสชัน
SET SESSION time_zone = 'Asia/Tokyo';
เปลี่ยนเขตเวลาเริ่มต้นของเซิร์ฟเวอร์
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์กำหนดค่า (my.cnf):
[mysqld]
default_time_zone = 'Asia/Tokyo'
ดึงเวลายูทีซีด้วย UTC_TIMESTAMP
SELECT UTC_TIMESTAMP();
แปลงเป็นเวลาท้องถิ่นด้วย CONVERT_TZ()
SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');
6. วิธีตั้งค่าเวลาปัจจุบันเป็นค่าเริ่มต้นใน MySQL
ตั้งค่า CURRENT_TIMESTAMP เป็นค่าเริ่มต้น
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
การอัปเดตอัตโนมัติด้วย ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
ความแตกต่างระหว่าง DATETIME และ TIMESTAMP
| Type | Affected by Time Zone | Can Set CURRENT_TIMESTAMP as Default |
|---|---|---|
TIMESTAMP | Yes | Yes |
DATETIME | No | No |
ทำไมจึงไม่สามารถใช้ NOW() เป็นค่าเริ่มต้นและวิธีแก้ไข
ERROR 1067 (42000): Invalid default value for 'created_at'
วิธีแก้ไข:
CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
7. ข้อผิดพลาดทั่วไปของ MySQL และวิธีแก้ไข (FAQ)
ไม่สามารถใช้ NOW() เป็นค่าเริ่มต้น
ตัวอย่างข้อผิดพลาด
CREATE TABLE logs (
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
วิธีแก้ไข
CREATE TABLE logs (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
เวลาของ CURRENT_TIMESTAMP ไม่ถูกต้อง
SHOW VARIABLES LIKE 'time_zone';
วิธีแก้ไข
SET SESSION time_zone = 'Asia/Tokyo';
ผลลัพธ์ของ NOW() คลาดเคลื่อนหนึ่งชั่วโมง
SHOW VARIABLES LIKE 'system_time_zone';
วิธีแก้ไข
SET GLOBAL time_zone = 'Asia/Tokyo';
การกรองช่วง BETWEEN ไม่ทำงานตามที่คาดหวัง
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';
วิธีแก้ไข
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
8. แนวปฏิบัติที่ดีที่สุดสำหรับการจัดการเวลาปัจจุบันใน MySQL
เมื่อใดควรใช้ NOW() เทียบกับ CURRENT_TIMESTAMP
| Use Case | Recommended |
|---|---|
Retrieve the current time in a SELECT statement | NOW() |
Automatically set the current time during INSERT | CURRENT_TIMESTAMP |
Set as the default value of a TIMESTAMP column | CURRENT_TIMESTAMP |
เมื่อใดควรใช้ TIMESTAMP เทียบกับ DATETIME
| Data Type | Affected by Time Zone | Storage Size |
|---|---|---|
TIMESTAMP | Yes | 4 bytes |
DATETIME | No | 8 bytes |
เก็บใน UTC และแปลงเป็นเวลาท้องถิ่น
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');
ใช้ >= และ < แทน BETWEEN
SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-03-01 00:00:00';
ทำให้การใช้ INTERVAL มีมาตรฐาน
SELECT NOW() + INTERVAL 1 DAY;
ทำความสะอาดข้อมูลเก่าอย่างเหมาะสม
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;


