คู่มือเวลา ณ ปัจจุบันของ MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, การตั้งค่าโซนเวลา & แนวปฏิบัติที่ดีที่สุด

目次

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 มีฟังก์ชันหลายตัวสำหรับดึงเวลาปัจจุบัน เข้าใจความแตกต่างและใช้ให้เหมาะสม

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT 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?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

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

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (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()

เพื่อดึงส่วนเฉพาะของวันที่ ให้ใช้ฟังก์ชันต่อไปนี้

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT 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
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + 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

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

ทำไมจึงไม่สามารถใช้ 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 CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

เมื่อใดควรใช้ TIMESTAMP เทียบกับ DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 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;