ในฐานะนักพัฒนาระบบที่ต้องจัดการข้อมูลเวลา (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) ซึ่งเป็นรากฐานสำคัญในการสร้างระบบที่เชื่อถือได้ในระยะยาว