PlusMagi's Blog By Pitt Phunsanit Database SQL Server:DATETIME และ DATETIME2

SQL Server:DATETIME และ DATETIME2

ในโลกของการพัฒนาฐานข้อมูล การจัดการวันที่และเวลา (Date and Time) เป็นหนึ่งในส่วนที่ซับซ้อนที่สุด เพราะความแตกต่างเล็กน้อยในการเก็บข้อมูลอาจนำไปสู่ปัญหาความคลาดเคลื่อนของข้อมูล (Data Inconsistency) ได้อย่างร้ายแรง

แม้ว่าหัวข้อต้นฉบับจะกล่าวถึงความแตกต่างระหว่าง DATETIME และ DATETIME2 ของ SQL Server แต่ในบริบทของ PostgreSQL ซึ่งเป็นระบบฐานข้อมูลที่เน้นมาตรฐานและความแม่นยำสูง เรามีชนิดข้อมูลที่ถูกออกแบบมาเพื่อแก้ไขปัญหาดังกล่าวโดยเฉพาะ นั่นคือ timestamp และ timestamptz

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

🕰️ PostgreSQL Timestamp: timestamp vs timestamptz

ใน PostgreSQL เรามีชนิดข้อมูลหลักสองประเภทที่ใช้แทนวันที่และเวลา ซึ่งมีความแตกต่างกันอย่างชัดเจนในเรื่องของการจัดการเขตเวลา (Time Zone Awareness):

1. timestamp (Timestamp without time zone)

  • การทำงาน: ชนิดข้อมูลนี้จะเก็บค่าวันที่และเวลาในรูปแบบที่ระบุเท่านั้น โดยไม่สนใจเรื่องเขตเวลาใดๆ
  • ข้อควรระวัง: หากคุณบันทึกข้อมูลเวลาจากหลายเขตเวลา (เช่น ผู้ใช้จากกรุงเทพฯ และนิวยอร์ก) แล้วนำมาเก็บด้วย timestamp ข้อมูลที่ได้จะไม่มีข้อมูลเขตเวลากำกับ ทำให้เกิดความสับสนเมื่อมีการนำไปประมวลผลในระบบที่แตกต่างกัน
  • ความแม่นยำ: รองรับความละเอียดสูงถึงระดับ Microseconds (6 ตำแหน่ง)

2. timestamptz (Timestamp with time zone)

  • การทำงาน: นี่คือชนิดข้อมูลที่แนะนำและควรใช้เป็นค่าเริ่มต้นเสมอ timestamptz จะเก็บค่าวันที่และเวลาพร้อมระบุเขตเวลากำกับ (Time Zone) เสมอ
  • ข้อดี: เมื่อคุณบันทึกข้อมูลเวลาด้วย timestamptz PostgreSQL จะทำการแปลงเวลาดังกล่าวให้เป็น UTC (Coordinated Universal Time) ก่อนจัดเก็บ จากนั้นเมื่อดึงข้อมูลออกมา ระบบจะแปลงกลับเป็นเขตเวลาที่ผู้ใช้ร้องขอ ทำให้มั่นใจได้ว่าข้อมูลเวลาจะถูกต้องไม่ว่าจะมีการใช้งานในพื้นที่ใดของโลก
  • ความแม่นยำ: รองรับความละเอียดสูงถึงระดับ Microseconds

💡 ตัวอย่างการใช้งานและข้อแตกต่างทางเทคนิค

เพื่อให้เห็นภาพชัดเจน เรามาดูการสร้างตารางและการบันทึกข้อมูลด้วย PostgreSQL กัน:

SQL

-- การสร้างตารางที่ใช้ timestamptz (แนะนำ) --
CREATE TABLE events_tz (
    event_id SERIAL PRIMARY KEY,
    event_time TIMESTAMP WITH TIME ZONE
);

-- การบันทึกข้อมูล (PostgreSQL จะจัดการแปลงเวลาให้เป็น UTC โดยอัตโนมัติ)
INSERT INTO events_tz (event_time) VALUES ('2024-06-15 10:00:00 Asia/Bangkok');

-- การสร้างตารางที่ใช้ timestamp (ไม่แนะนำหากข้อมูลมาจากหลายเขตเวลา) --
CREATE TABLE events_naive (
    event_id SERIAL PRIMARY KEY,
    event_time TIMESTAMP
);

-- การบันทึกข้อมูล (ข้อมูลนี้จะถูกเก็บโดยไม่มีการระบุเขตเวลาที่ชัดเจน)
INSERT INTO events_naive (event_time) VALUES ('2024-06-15 10:00:00');

✅ บทสรุป: แนวทางปฏิบัติที่ดีที่สุด (Best Practice)

หากคุณกำลังออกแบบ Schema ใน PostgreSQL และต้องจัดการกับข้อมูลวันที่และเวลาที่มาจากแหล่งที่มาหลากหลาย หรือผู้ใช้งานที่มาจากหลายเขตเวลา คุณควรใช้ timestamptz เสมอ

การใช้ timestamptz ไม่เพียงแต่ช่วยป้องกันปัญหาความคลาดเคลื่อนของเขตเวลา (Time Zone Ambiguity) เท่านั้น แต่ยังสอดคล้องกับหลักการออกแบบระบบฐานข้อมูลระดับ Senior Architect ที่ต้องการความแม่นยำและความยืดหยุ่นในการขยายตัวของระบบในอนาคต