1. MySQL DATETIME คืออะไร?
MySQL DATETIME เป็นชนิดข้อมูลที่ใช้เก็บทั้งวันที่และเวลาไว้ในฟิลด์เดียว การจัดการค่าที่เป็นวันที่และเวลาในฐานข้อมูลเป็นสิ่งสำคัญสำหรับแอปพลิเคชันหลายประเภท เช่น ระบบบันทึกเหตุการณ์และระบบการจอง DATETIME จะเก็บวันที่และเวลาไว้ด้วยกันและรองรับค่าช่วงกว้าง ช่วงค่าของมันคือจาก '1000-01-01 00:00:00' ถึง '9999-12-31 23:59:59' และยังรองรับวินาทีเศษส่วนอีกด้วย
2. ภาพรวมของชนิดข้อมูลวันที่และเวลาใน MySQL
2.1 ชนิดข้อมูลสำหรับจัดการวันที่และเวลา
MySQL มีชนิดข้อมูลต่อไปนี้สำหรับทำงานกับวันที่และเวลา:
DATE: เก็บวันที่ (ปี, เดือน, วัน) ช่วงค่าคือ'1000-01-01'ถึง'9999-12-31'.TIME: เก็บเวลาเท่านั้น ช่วงค่าคือ'-838:59:59'ถึง'838:59:59'.DATETIME: เก็บทั้งวันที่และเวลา ช่วงค่าคือ'1000-01-01 00:00:00'ถึง'9999-12-31 23:59:59'.TIMESTAMP: เก็บค่า UNIX timestamp ช่วงค่าคือ'1970-01-01 00:00:01'ถึง'2038-01-19 03:14:07'.
2.2 ความแตกต่างระหว่าง DATETIME กับ TIMESTAMP
DATETIME และ TIMESTAMP มีลักษณะคล้ายกัน แต่มีความแตกต่างดังต่อไปนี้:
- เขตเวลา :
DATETIMEเก็บค่าคงที่ที่ไม่ขึ้นกับเขตเวลา ในขณะที่TIMESTAMPจะถูกแปลงเป็น UTC เมื่อบันทึกและจะแปลงกลับเป็นเขตเวลาปัจจุบันของเซิร์ฟเวอร์เมื่อดึงค่าออกมา ด้วยเหตุนี้DATETIMEจึงเหมาะกับค่าที่ไม่ขึ้นกับเขตเวลา (เช่น เวลาเหตุการณ์) ส่วนTIMESTAMPเหมาะกับข้อมูลที่ผูกกับเขตเวลาของเซิร์ฟเวอร์ เช่น บันทึกเหตุการณ์ - รูปแบบการจัดเก็บ :
DATETIMEถูกจัดเก็บตามค่าที่กำหนดไว้โดยตรง ส่วนTIMESTAMPจะถูกจัดเก็บเป็น UNIX timestamp ดังนั้นค่าของTIMESTAMPจะได้รับผลกระทบจากการตั้งค่าเขตเวลาของเซิร์ฟเวอร์เมื่อแสดงเวลา
3. วิธีใช้ DATETIME ใน MySQL
3.1 การสร้างคอลัมน์ DATETIME
เพื่อสร้างคอลัมน์ที่ใช้ชนิด DATETIME ให้ใช้ไวยากรณ์ SQL ดังต่อไปนี้:
CREATE TABLE sample_table (
event_time DATETIME
);
ในตัวอย่างนี้ จะสร้างคอลัมน์ DATETIME ชื่อ event_time ในตารางที่ชื่อ sample_table
3.2 การแทรกค่า DATETIME
ค่า DATETIME ของ MySQL สามารถแทรกได้หลายรูปแบบ รูปแบบพื้นฐานคือ 'YYYY-MM-DD HH:MM:SS' ตัวอย่างเช่น:
INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');
รูปแบบต่อไปนี้ก็ได้รับการยอมรับเช่นกัน:
'YY-MM-DD HH:MM:SS': รูปแบบที่ใช้ปีสองหลัก'YYYYMMDDHHMMSS': รูปแบบที่ไม่มีตัวคั่น
ตัวอย่าง:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
ข้อมูลที่แทรกในรูปแบบเหล่านี้จะถูกจัดเก็บอย่างถูกต้อง หากระบุปีด้วยสองหลัก '70-99' จะถูกแปลงเป็น 1970-1999 และ '00-69' จะถูกแปลงเป็น 2000-2069
3.3 การดึงค่า DATETIME
เมื่อดึงค่า DATETIME MySQL จะแสดงผลในรูปแบบเริ่มต้น 'YYYY-MM-DD HH:MM:SS' ตัวอย่างเช่น:
SELECT event_time FROM sample_table;
คิวรีนี้จะแสดงค่าที่อยู่ในคอลัมน์ DATETIME ด้วยรูปแบบมาตรฐาน
4. การทำงานกับวินาทีเศษส่วน
4.1 ความแม่นยำของ DATETIME
ใน MySQL ค่า DATETIME สามารถรวมวินาทีเศษส่วนได้ คุณสามารถกำหนดความแม่นยำด้วยตัวเลือก fsp ซึ่งอนุญาตให้เก็บวินาทีเศษส่วนตั้งแต่ 0 ถึง 6 หลัก ตัวอย่างเช่น การสร้างคอลัมน์ที่มีวินาทีเศษส่วน 3 หลัก:
CREATE TABLE precise_times (
event_time DATETIME(3)
);
ในตัวอย่างนี้ คอลัมน์ event_time สามารถเก็บวินาทีเศษส่วนได้สูงสุด 3 หลัก
4.2 การแทรกค่าที่มีวินาทีเศษส่วน
เพื่อแทรกค่า DATETIME ที่รวมวินาทีเศษส่วน ให้ใช้คำสั่งต่อไปนี้:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');
This query stores the value including fractional seconds accurately. The fractional part is stored without being truncated, and the precision is preserved when retrieving the value.

5. แนวทางปฏิบัติที่ดีที่สุดสำหรับ DATETIME
5.1 การเลือกใช้ระหว่าง DATETIME กับ TIMESTAMP
- เมื่อใดควรใช้
DATETIME: สำหรับค่าที่เป็นวันที่/เวลาแบบคงที่ที่ไม่ขึ้นกับโซนเวลา (เช่น เวลาเริ่มต้นของกิจกรรมหรือวันที่จอง) - เมื่อใดควรใช้
TIMESTAMP: สำหรับข้อมูลวันที่/เวลาที่เกี่ยวข้องกับโซนเวลาเซิร์ฟเวอร์ (เช่น เวลาที่บันทึกหรืออัปเดตข้อมูล)
5.2 การจัดการโซนเวลา
เนื่องจาก DATETIME ไม่ได้จัดเก็บข้อมูลโซนเวลา แอปพลิเคชันของคุณจึงต้องจัดการโซนเวลาแยกต่างหาก ในทางกลับกัน TIMESTAMP จะคำนวณโซนเวลาเซิร์ฟเวอร์โดยอัตโนมัติเมื่อจัดเก็บและดึงค่าต่าง ๆ ทำให้เหมาะกับระบบที่ทำงานข้ามโซนเวลาในระดับโลก.
6. ข้อผิดพลาดทั่วไปและวิธีหลีกเลี่ยง
6.1 วันที่ศูนย์และค่าที่ไม่ถูกต้อง
ใน MySQL หากคุณพยายามแทรกค่า DATETIME ที่ไม่ถูกต้อง อาจทำให้บันทึกวันที่ศูนย์เช่น '0000-00-00 00:00:00' ได้ เนื่องจากโดยทั่วไปแล้วไม่ใช่วันที่ที่ถูกต้อง คุณควรทำการตรวจสอบข้อมูลอินพุตเพื่อป้องกันไม่ให้ค่าที่ไม่ถูกต้องถูกแทรก การทำ validation ที่ทำให้แน่ใจว่าข้อมูลอินพุตอยู่ในช่วงและรูปแบบที่ถูกต้องสามารถช่วยป้องกันไม่ให้บันทึกวันที่ศูนย์ได้.
6.2 การใช้ความแม่นยำอย่างไม่เหมาะสม
เมื่อกำหนดความแม่นยำของวินาทีเศษส่วน การใช้ความแม่นยำที่ไม่ถูกต้องอาจทำให้ได้ผลลัพธ์ที่ไม่คาดคิด ให้ตั้งค่าความแม่นยำของวินาทีเศษส่วนเฉพาะเมื่อจำเป็น และเลือกค่าของ fsp อย่างระมัดระวัง ตัวอย่างเช่น หากแอปพลิเคชันของคุณไม่ต้องการความแม่นยำระดับส่วนของวินาที คุณไม่จำเป็นต้องเพิ่มวินาทีเศษส่วนในคอลัมน์ DATETIME.
7. สรุป
ในบทความนี้ เราได้อธิบายประเภท DATETIME ของ MySQL อย่างละเอียด DATETIME เป็นประเภทข้อมูลที่มีประโยชน์มากสำหรับการจัดเก็บทั้งวันที่และเวลา และเหมาะสมเมื่อคุณต้องการเก็บค่าที่ไม่ควรได้รับผลกระทบจากโซนเวลา ด้วยการเข้าใจความแตกต่างระหว่าง DATETIME กับ TIMESTAMP วิธีการทำงานของโซนเวลา และการใช้วินาทีเศษส่วน คุณจะสามารถจัดการข้อมูลวันที่/เวลาในฐานข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น นอกจากนี้ การรู้ถึงข้อผิดพลาดทั่วไปและวิธีหลีกเลี่ยงจะช่วยรักษาความสอดคล้องและความน่าเชื่อถือของข้อมูล.
8. คำถามที่พบบ่อย (FAQ)
Q1: ความแตกต่างหลักระหว่าง DATETIME กับ TIMESTAMP คืออะไร?
DATETIME จัดเก็บวันที่และเวลาที่คงที่ซึ่งไม่ขึ้นกับโซนเวลา ตัวอย่างเช่น เหมาะสำหรับการเก็บวันที่จองหรือเวลาเหตุการณ์ที่ควรคงเดิมในทุกโซนเวลา ในทางตรงกันข้าม TIMESTAMP จะถูกจัดเก็บในรูปแบบ UTC และแปลงเป็นโซนเวลาเซิร์ฟเวอร์เมื่อดึงข้อมูลออกมา เหมาะสำหรับข้อมูลวันที่/เวลาที่ขึ้นกับโซนเวลาเซิร์ฟเวอร์ เช่น บันทึกเหตุการณ์ (log).
Q2: ฉันจะจัดเก็บวินาทีเศษส่วนกับ DATETIME ได้อย่างไร?
คุณสามารถกำหนดความแม่นยำของวินาทีเศษส่วนได้โดยระบุค่า fsp เมื่อสร้างคอลัมน์ DATETIME ตัวอย่างเช่น DATETIME(3) จะจัดเก็บวินาทีเศษส่วนได้สูงสุด 3 หลัก ใช้ค่าที่มีรูปแบบถูกต้องรวมถึงวินาทีเศษส่วนเมื่อทำการแทรกข้อมูล และค่าจะถูกจัดเก็บอย่างถูกต้อง.
Q3: ควรใช้ DATETIME หรือ TIMESTAMP ?
ขึ้นอยู่กับกรณีการใช้งานของคุณ ใช้ DATETIME เมื่อคุณต้องการจัดเก็บวันที่และเวลาที่คงที่ ใช้ TIMESTAMP สำหรับข้อมูลวันที่/เวลาที่ได้รับผลกระทบจากโซนเวลาเซิร์ฟเวอร์ เช่น เวลาการสร้างหรืออัปเดตบันทึก เนื่องจาก TIMESTAMP ทำการแปลงโซนเวลาโดยอัตโนมัติ จึงเหมาะเมื่อระบบของคุณต้องทำงานข้ามโซนเวลาต่าง ๆ.


