ป้ายกำกับ: Generate_series

วันและเวลาในจาว่าสคริปต์ : เพิ่ม ลด วัน เวลาวันและเวลาในจาว่าสคริปต์ : เพิ่ม ลด วัน เวลา

ในฐานะ System Specialist และ Senior Database Architect การจัดการกับข้อมูลวันและเวลา (Date and Time) อย่างแม่นยำเป็นหัวใจสำคัญของการออกแบบระบบฐานข้อมูลที่เชื่อถือได้ หากคุณกำลังทำงานกับ PostgreSQL คุณจะไม่ต้องกังวลเรื่องการคำนวณวันที่ที่ซับซ้อนอีกต่อไป เพราะ PostgreSQL มีชุดฟังก์ชันและไวยากรณ์ที่ทรงพลังในการเพิ่ม ลด หรือขยายช่วงเวลาได้อย่างง่ายดาย

วันและเวลาใน PostgreSQL: การคำนวณระยะห่าง (Date Arithmetic)

หลักการพื้นฐานของการจัดการวันที่ใน PostgreSQL คือการใช้คีย์เวิร์ด INTERVAL ซึ่งช่วยให้เราสามารถระบุช่วงเวลาที่ต้องการเพิ่มหรือลดได้ ไม่ว่าจะเป็นหน่วยวัน, ชั่วโมง, นาที หรือปี การคำนวณเหล่านี้จะถูกนำไปบวกหรือลบออกจากค่า Date/Timestamp เดิมโดยตรง ทำให้โค้ดมีความกระชับและอ่านง่าย

1. การเพิ่มและการลดช่วงเวลาพื้นฐาน (Days, Weeks)

การดำเนินการที่ง่ายที่สุดคือการบวกหรือลบค่า INTERVAL เข้ากับคอลัมน์วันที่ใด ๆ PostgreSQL จะจัดการเรื่องข้ามเดือนและปีให้โดยอัตโนมัติ

SQL

-- วันปัจจุบัน + 3 วันข้างหน้า (เพิ่มวัน)
SELECT current_date + interval '3 days';

-- วันที่เมื่อ 2 สัปดาห์ที่แล้ว (ลดสัปดาห์)
SELECT current_timestamp - interval '2 weeks';

2. การจัดการหน่วยเวลาที่ซับซ้อน (Months, Years)

สำหรับหน่วยเวลาที่ใหญ่ขึ้น เช่น เดือนหรือปี เรายังคงใช้ INTERVAL ได้ แต่ควรระมัดระวังเรื่องการคำนวณข้ามเดือนที่มีจำนวนวันไม่เท่ากัน (เช่น จากวันที่ 31 ไปเดือนถัดไป)

SQL

-- เพิ่ม 6 เดือนจากวันที่กำหนด
SELECT '2024-01-15'::date + interval '6 months';

-- ลด 1 ปีและ 3 เดือน (ผสมหน่วย)
SELECT current_date - interval '1 year' - interval '3 months';

3. การสร้างชุดข้อมูลช่วงเวลาด้วย generate_series

หากคุณต้องการคำนวณวันที่ต่อเนื่องเป็นลำดับ (เช่น ต้องการดู 30 วันข้างหน้า หรือต้องการวนลูปเพื่อหาค่าในแต่ละวัน) ฟังก์ชันที่ทรงพลังที่สุดคือ generate_series() ซึ่งช่วยสร้างชุดของ Timestamp ได้อย่างมีประสิทธิภาพ

SQL

-- สร้างช่วงวันที่ต่อเนื่อง 7 วัน (รวมวันเริ่มต้นด้วย)
SELECT generate_series(current_date, current_date + interval '6 days', interval '1 day');

บทสรุปและข้อสังเกตสำหรับสถาปนิกฐานข้อมูล

การใช้ INTERVAL ใน PostgreSQL ไม่เพียงแต่ทำให้โค้ดสะอาดตาเท่านั้น แต่ยังช่วยให้เรามั่นใจได้ว่าการคำนวณวันที่ของเราจะถูกต้องตามหลักปฏิทิน (Calendar Logic) โดยอัตโนมัติ ซึ่งเป็นสิ่งที่สำคัญอย่างยิ่งในการออกแบบระบบที่ต้องมีการตรวจสอบช่วงเวลา เช่น ระบบบัญชี หรือระบบติดตามสถานะสินค้า

จงจำไว้เสมอว่า PostgreSQL ถูกออกแบบมาให้จัดการความซับซ้อนของวันที่และเวลานี้ได้อย่างสมบูรณ์ ทำให้คุณสามารถเขียน Query ที่มีประสิทธิภาพสูงโดยไม่ต้องกังวลเรื่อง Edge Cases ของการคำนวณวันเดือนปีอีกต่อไป