DATETIME ใน MySQL: คู่มือครบวงจรสำหรับการจัดการวันที่และเวลา

目次

1. DATETIME ใน MySQL คืออะไร

DATETIME ใน MySQL เป็นประเภทข้อมูลที่ใช้จัดการทั้งวันที่และเวลาพร้อมกัน การจัดการข้อมูลวันที่และเวลาในฐานข้อมูลเป็นสิ่งสำคัญสำหรับแอปพลิเคชันต่างๆ เช่น การบันทึกข้อมูล (logging) หรือระบบจอง ฯลฯ ประเภทข้อมูล DATETIME จะจัดเก็บวันที่และเวลาไว้ในฟิลด์เดียว และสามารถเก็บค่าได้หลากหลาย โดยมีช่วงตั้งแต่ '1000-01-01 00:00:00' ถึง '9999-12-31 23:59:59' และยังรองรับเศษวินาที (fractional seconds) ด้วย

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 มีความคล้ายคลึงกัน แต่มีความแตกต่างดังต่อไปนี้:
     
  • เขตเวลา (Timezone): DATETIME จัดเก็บค่าคงที่ที่ไม่ขึ้นกับเขตเวลา ในขณะที่ TIMESTAMP จะถูกแปลงเป็น UTC เมื่อจัดเก็บ และถูกแปลงกลับเป็นเขตเวลาปัจจุบันของเซิร์ฟเวอร์เมื่อดึงข้อมูล ดังนั้น DATETIME จึงเหมาะสำหรับวันที่และเวลาที่ไม่ได้รับผลกระทบจากเขตเวลา (เช่น วันที่จัดงาน) ส่วน TIMESTAMP เหมาะสำหรับข้อมูลที่เกี่ยวข้องกับเขตเวลาของเซิร์ฟเวอร์ เช่น การบันทึกข้อมูล (logging)
  •  
  • รูปแบบการจัดเก็บ: 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': รูปแบบที่ระบุปีด้วยตัวเลข 2 หลัก
  •  
  • 'YYYYMMDDHHMMSS': รูปแบบที่ระบุโดยไม่มีตัวคั่น
ตัวอย่าง:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
ข้อมูลที่แทรกในรูปแบบเหล่านี้จะถูกจัดเก็บอย่างถูกต้อง หากระบุปีด้วยตัวเลข 2 หลัก '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. การจัดการเศษวินาที (Fractional Seconds)

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');
คิวรีนี้จะจัดเก็บค่าที่มีเศษวินาทีได้อย่างถูกต้อง ค่าเศษส่วนที่แทรกจะไม่ถูกปัดเศษและจะถูกเก็บรักษาไว้เมื่อดึงข้อมูล

5. แนวทางปฏิบัติที่ดีที่สุดสำหรับ DATETIME

5.1 การเลือกใช้ DATETIME และ TIMESTAMP

     
  • กรณีที่ควรใช้ DATETIME: วันที่และเวลาคงที่ที่ไม่ขึ้นกับเขตเวลา (เช่น เวลาเริ่มต้นของกิจกรรม, วันที่จอง)
  •  
  • กรณีที่ควรใช้ TIMESTAMP: ข้อมูลวันที่และเวลาที่เกี่ยวข้องกับเขตเวลาของเซิร์ฟเวอร์ (เช่น เวลาที่สร้างหรืออัปเดตข้อมูล)

5.2 การจัดการเขตเวลา

DATETIME ไม่มีแนวคิดเรื่องเขตเวลา ดังนั้นจึงจำเป็นต้องมีการจัดการเขตเวลาในฝั่งแอปพลิเคชัน ในทางกลับกัน TIMESTAMP จะพิจารณาเขตเวลาของเซิร์ฟเวอร์โดยอัตโนมัติเมื่อจัดเก็บและดึงค่า จึงเหมาะสำหรับการทำงานในเขตเวลาที่แตกต่างกันทั่วโลก

6. ข้อผิดพลาดที่พบบ่อยและวิธีหลีกเลี่ยง

6.1 วันที่ศูนย์ (Zero Date) และค่าที่ไม่ถูกต้อง

ใน 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 และจะถูกแปลงเป็นเขตเวลาของเซิร์ฟเวอร์เมื่อดึงข้อมูล เหมาะสำหรับข้อมูลวันที่และเวลาที่ขึ้นอยู่กับเขตเวลาของเซิร์ฟเวอร์ เช่น การบันทึกข้อมูล (logging)

Q2: จะบันทึกเศษวินาทีใน DATETIME ได้อย่างไร?

เมื่อสร้างคอลัมน์ DATETIME คุณสามารถกำหนดความแม่นยำของเศษวินาทีได้โดยการระบุค่า fsp ตัวอย่างเช่น การระบุ DATETIME(3) จะช่วยให้คุณสามารถจัดเก็บเศษวินาทีได้สูงสุด 3 หลัก เมื่อแทรกค่า ให้ใช้ค่าที่มีเศษวินาทีและจะถูกจัดเก็บในรูปแบบที่เหมาะสม

Q3: ควรใช้ DATETIME หรือ TIMESTAMP ดี?

ขึ้นอยู่กับวัตถุประสงค์ หากคุณต้องการจัดเก็บวันที่และเวลาที่คงที่ ให้ใช้ DATETIME ในทางกลับกัน หากเป็นข้อมูลวันที่และเวลาที่ได้รับผลกระทบจากเขตเวลาของเซิร์ฟเวอร์ เช่น เวลาที่สร้างหรืออัปเดตข้อมูล ให้ใช้ TIMESTAMP เนื่องจาก TIMESTAMP มีการแปลงเขตเวลาอัตโนมัติ จึงเหมาะสำหรับการทำงานที่ต้องการการดำเนินงานในเขตเวลาที่แตกต่างกัน