PlusMagi's Blog By Pitt Phunsanit Backend,Database Database Data Types: การเลือกใช้เวลา DATE vs DATETIME vs TIMESTAMP vs DATETIME2

Database Data Types: การเลือกใช้เวลา DATE vs DATETIME vs TIMESTAMP vs DATETIME2

ในฐานะนักพัฒนาระบบที่ต้องจัดการข้อมูลเวลา (Temporal Data) อย่างแม่นยำ การเลือกใช้ประเภทข้อมูล (Data Type) ในระบบฐานข้อมูลถือเป็นขั้นตอนที่สำคัญที่สุดอย่างหนึ่ง ความคลาดเคลื่อนเพียงเล็กน้อยในการเลือกใช้ประเภทข้อมูลเวลา อาจนำไปสู่ปัญหาความผิดเพี้ยนทางเขตเวลา (Time Zone Drift) หรือการคำนวณที่ไม่ถูกต้องในระดับแอปพลิเคชันได้

บทความนี้จะเจาะลึกการเปรียบเทียบประเภทข้อมูลเวลาหลักๆ ในระบบ PostgreSQL เพื่อให้คุณสามารถตัดสินใจเลือกใช้ได้อย่างถูกต้องตามหลักการออกแบบสถาปัตยกรรมระบบที่แข็งแกร่ง

⚠ PostgreSQL Data Types: DATE, TIME, และ TIMESTAMP

PostgreSQL มีการจัดการข้อมูลเวลาที่ละเอียดและเป็นมาตรฐาน โดยเราจะเน้นที่ 3 ประเภทหลักที่เกี่ยวข้องกับเวลา ได้แก่ DATE, TIME, และ TIMESTAMP ซึ่งมีความแตกต่างกันอย่างชัดเจนในเรื่องของขอบเขตการจัดเก็บ (Storage Scope) และการจัดการเขตเวลา (Time Zone Awareness)

+ DATE (วันที่เท่านั้น)

ใช้สำหรับจัดเก็บเฉพาะวันที่เท่านั้น (Year-Month-Day) เหมาะสำหรับการบันทึกวันเกิด วันที่หมดอายุ หรือวันที่ที่ไม่มีความสำคัญของเวลา

+ TIME (เวลาเท่านั้น)

ใช้สำหรับจัดเก็บเฉพาะเวลา (Hour:Minute:Second) เหมาะสำหรับการกำหนดเวลาเปิด-ปิดทำการ หรือเวลาที่เกิดซ้ำในแต่ละวัน

+ TIMESTAMP (วันที่และเวลา)

นี่คือประเภทที่ซับซ้อนที่สุดและสำคัญที่สุดในเชิงสถาปัตยกรรม โดย PostgreSQL แยก TIMESTAMP ออกเป็น 2 รูปแบบหลัก:

  • TIMESTAMP WITHOUT TIME ZONE: บันทึกวันที่และเวลาโดยไม่มีการระบุเขตเวลา (Time Zone) ทำให้ข้อมูลที่ได้เป็นค่าดิบ (Raw value) ซึ่งอาจเกิดปัญหาเมื่อระบบทำงานข้ามภูมิภาค
  • TIMESTAMP WITH TIME ZONE: (แนะนำให้ใช้) เป็นตัวเลือกที่เหนือกว่า เพราะมันจะจัดเก็บข้อมูลเวลาโดยการแปลงค่าให้เป็นมาตรฐานสากล (UTC) ก่อนบันทึก ทำให้ไม่ว่าผู้ใช้จะเข้าถึงระบบจากเขตเวลาใด ข้อมูลที่ดึงมาก็จะแสดงผลได้อย่างถูกต้องตามเวลาโลก

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

การสร้างตารางและแทรกข้อมูลเพื่อเปรียบเทียบความแตกต่างของประเภทข้อมูล:

SQL

-- 1. สร้างตารางที่ใช้ TIMESTAMP WITH TIME ZONE (Best Practice) </code>
CREATE TABLE event_log (
    event_id SERIAL PRIMARY KEY,
    event_date DATE,
    event_time TIME,
    event_timestamp TIMESTAMPTZ
);

-- 2. แทรกข้อมูลตัวอย่าง </code>
INSERT INTO event_log (event_date, event_time, event_timestamp) VALUES
('2024-10-20', '14:30:00', '2024-10-20 14:30:00-07');

-- 3. การดึงข้อมูล (PostgreSQL จะจัดการการแปลง Time Zone ให้โดยอัตโนมัติ) </code>
SELECT event_timestamp FROM event_log;

⚠ สรุปและข้อแนะนำจาก Senior Architect

ในการออกแบบระบบที่ต้องการความแม่นยำและรองรับผู้ใช้งานทั่วโลก (Multi-timezone Application) คุณควรเลือกใช้ TIMESTAMP WITH TIME ZONE เสมอ

การใช้ TIMESTAMP WITH TIME ZONE ช่วยให้คุณมั่นใจได้ว่า ไม่ว่าระบบจะถูกเรียกใช้งานจากเซิร์ฟเวอร์ที่ตั้งอยู่ในเขตเวลาใด ข้อมูลเวลาที่ถูกบันทึกและดึงออกมาก็จะมีความถูกต้องและสม่ำเสมอตามมาตรฐานสากล (UTC) ซึ่งเป็นรากฐานสำคัญในการสร้างระบบที่เชื่อถือได้ในระยะยาว

Exit mobile version