0Pricing
SQL Interview Prep · บทเรียน

การคำนวณวันที่และช่วงเวลา

บวกหรือลบช่วงเวลา และคำนวณความแตกต่างระหว่างวันที่

การคำนวณวันที่และช่วงเวลา เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการคำนวณวันที่จึงปรากฏในการสัมภาษณ์

การคำนวณเกี่ยวกับวันที่เป็นทักษะ SQL ที่ใช้งานได้จริงอย่างมาก ผู้สัมภาษณ์จึงมักเน้นเรื่องนี้สำหรับตำแหน่งนักวิเคราะห์และนักพัฒนาระบบเบื้องหลัง คำถามทางธุรกิจแทบทุกข้อมีองค์ประกอบด้านเวลา เช่น 30 วันที่ผ่านมา จำนวนคำสั่งซื้อต่อสัปดาห์ หรือ จำนวนวันนับจากวันที่สมัคร

ข้อควรระวังคือฟังก์ชันวันที่เป็นส่วนของ SQL ที่มีมาตรฐานร่วมกันน้อยที่สุด การดำเนินการเดียวกันอาจใช้ไวยากรณ์ต่างกันใน PostgreSQL, MySQL และ SQL Server ผู้สมัครที่มีความสามารถจะอธิบายแนวคิดให้ชัดเจนก่อน แล้วจึงปรับไวยากรณ์ให้เข้ากับภาษาย่อย

  • การบวกหรือลบช่วงเวลา
  • การคำนวณความแตกต่างระหว่างวันที่สองวัน
  • การทำงานกับค่า INTERVAL

ชนิดข้อมูล INTERVAL

ใน PostgreSQL และมาตรฐาน SQL ช่วงเวลาเป็นค่าแบบเต็มรูปแบบชนิดหนึ่งที่เรียกว่า ช่วงเวลา คุณสามารถบวกหรือลบค่านี้กับวันที่หรือเวลาประทับได้โดยใช้ตัวดำเนินการ + และ - ตามปกติ

นี่เป็นวิธีที่ชัดเจนที่สุดในการเขียน “30 วันที่แล้ว” หรือ “อีก 3 เดือนนับจากนี้” และผู้สัมภาษณ์ชื่นชอบเพราะอ่านแล้วมีความหมายเหมือนภาษาธรรมชาติ

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

การบวกช่วงเวลาในภาษาย่อยต่างๆ

ผู้สัมภาษณ์มักถามว่า “คุณจะบวก 7 วันใน MySQL กับ SQL Server อย่างไร” การรู้จักภาษาย่อยหลักทั้งสามแบบแสดงให้เห็นว่าคุณมีประสบการณ์จริง

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL Server: DATEADD(day, 7, d)

แนวคิดเหมือนกันทุกประการ ต่างกันเพียงรูปแบบการเขียนเท่านั้น โปรดระบุเสมอว่ากำลังเขียนสำหรับภาษาย่อยใด

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

ความแตกต่างระหว่างวันที่สองวัน

อีกส่วนหนึ่งของการคำนวณวันที่คือการคำนวณว่าระหว่างวันที่สองวันห่างกันเท่าใด ผลลัพธ์ขึ้นอยู่กับหน่วยและภาษาย่อยที่ใช้

ใน PostgreSQL การลบค่า date สองค่าให้จำนวนเต็มซึ่งเป็นจำนวนวันโดยตรง ส่วนการลบค่า timestamp สองค่าให้ผลลัพธ์เป็นช่วงเวลาแทน

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF และข้อควรระวัง

DATEDIFF มีอยู่ใน MySQL และ SQL Server แต่ทำงานแตกต่างกัน ซึ่งเป็นจุดหลอกในการสัมภาษณ์ที่ผู้สัมภาษณ์ชื่นชอบ

  • MySQL: DATEDIFF(end, start) ส่งคืนเฉพาะจำนวนวันเต็ม
  • SQL Server: DATEDIFF(unit, start, end) รับหน่วยและนับการข้ามขอบเขต ไม่ใช่จำนวนหน่วยที่ผ่านไปเต็มหน่วย

พฤติกรรมเรื่องขอบเขตนี้สำคัญมาก: DATEDIFF(year, '2023-12-31', '2024-01-01') ใน SQL Server ส่งคืนค่าเป็น 1 แม้เวลาจะผ่านไปเพียงหนึ่งวัน

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

การคำนวณอายุเป็นปีอย่างถูกต้อง

“คำนวณอายุของลูกค้าเป็นปี” เป็นโจทย์คลาสสิก การนำจำนวนวันที่ต่างกันมาแบ่งด้วย 365 แบบตรงไปตรงมาจะคลาดเคลื่อนเนื่องจากปีอธิกสุรทิน PostgreSQL มี AGE() ซึ่งส่งคืนช่วงเวลาตามปฏิทินจริง

หากต้องการจำนวนปีเต็มที่สะอาด ให้ดึงส่วนปีของอายุออกมา

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

ตัวอย่างที่ทำเสร็จแล้ว: คำสั่งซื้อในช่วง 30 วันที่ผ่านมา

นี่เป็นเงื่อนไขกรองที่มักถูกถามในการสัมภาษณ์ วิธีที่ถูกต้องคือเปรียบเทียบคอลัมน์วันที่กับจุดตัดที่คำนวณไว้ ไม่ใช่นำคอลัมน์ไปครอบด้วยฟังก์ชัน

การเปรียบเทียบ order_date กับจุดตัดคงที่จะทำให้ดัชนีที่มีอยู่บน order_date ยังคงใช้งานได้ เราจะกลับมาพูดถึงประเด็นเรื่องดัชนีนี้ในภายหลัง

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

ช่วงแบบเปิดด้านหนึ่งสำหรับเดือนปฏิทิน

เมื่อถูกถามถึง “คำสั่งซื้อทั้งหมดในเดือนมีนาคม 2024” ให้หลีกเลี่ยงการใช้ BETWEEN '2024-03-01' AND '2024-03-31' กับคอลัมน์เวลาประทับ วิธีนี้จะพลาดแถวที่เกิดขึ้นตอน 23:00 น. ของวันที่ 31 มีนาคม และมีโอกาสเกิดข้อผิดพลาดแบบเกินหรือขาดหนึ่งหน่วย

รูปแบบที่รัดกุมคือ ช่วงแบบเปิดด้านหนึ่ง: ใช้ >= กับจุดเริ่มต้น และใช้ < กับจุดเริ่มต้นของเดือนถัดไป วิธีนี้ใช้ได้กับคอลัมน์ที่มีความละเอียดของเวลาแบบใดก็ได้

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT และส่วนประกอบของวันที่

การดึงองค์ประกอบเดียวจากวันที่เป็นงานที่ทำเป็นประจำในการทำรายงาน ฟังก์ชันมาตรฐานคือ EXTRACT(part FROM d) ซึ่ง PostgreSQL และ MySQL รองรับ

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) สำหรับวันในสัปดาห์
  • SQL Server ใช้ DATEPART(weekday, d) แทน

โปรดสังเกตว่า การดึงเฉพาะ MONTH จะนำเดือนมีนาคมของปีต่างๆมารวมกัน ซึ่งโดยทั่วไปไม่ใช่สิ่งที่ต้องการ

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

ตัวอย่างเชิงลึก: จำนวนวันจนถึงวันเกิดครั้งถัดไป

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

การอธิบายขั้นตอนนี้ออกมาให้ฟังจะแสดงให้ผู้สัมภาษณ์เห็นว่าคุณสามารถให้เหตุผลกับกรณีขอบ เช่น วันเกิดที่ผ่านไปแล้วในปีนี้

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

วันแรกและวันสุดท้ายของเดือน

คำถาม “แสดงวันสุดท้ายของเดือนของคำสั่งซื้อแต่ละรายการ” ใช้ทดสอบว่าคุณจะเลือกใช้ฟังก์ชันสำเร็จรูปหรือเขียนขึ้นใหม่ PostgreSQL นำ DATE_TRUNC มาประกอบกับการคำนวณช่วงเวลา ส่วน MySQL มี LAST_DAY() ให้ใช้โดยตรง

เคล็ดลับในการหาวันสุดท้ายของเดือนใน PostgreSQL คือ ตัดค่าให้เหลือจุดเริ่มต้นของเดือน บวกหนึ่งเดือน แล้วลบหนึ่งวัน

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับพฤติกรรมของการคำนวณความแตกต่างระหว่างวันที่ในภาษาย่อยต่างๆ

สรุปทบทวน: การคำนวณวันที่และช่วงเวลา

ประเด็นสำคัญสำหรับการสัมภาษณ์:

  • ใช้ค่า INTERVAL ร่วมกับ +/- ใน PostgreSQL ใช้ DATE_ADD/DATEDIFF ใน MySQL และใช้ DATEADD/DATEDIFF ใน SQL Server
  • DATEDIFF ของ SQL Server นับการข้ามขอบเขต ไม่ใช่หน่วยเวลาที่ผ่านไปจริง นี่คือจุดหลอกสำคัญที่สุด
  • สำหรับอายุที่คำนวณเป็นปี ให้ดึงค่าจาก AGE() แทนการนำจำนวนวันมาหารด้วย 365
  • กรองแถวล่าสุดด้วยการเปรียบเทียบคอลัมน์กับจุดตัดที่คำนวณไว้ และใช้ช่วงแบบเปิดด้านหนึ่ง (>= start AND < next) สำหรับช่วงของเดือน

อธิบายแนวคิดก่อน แล้วจึงปรับตามภาษาย่อย

คำถามที่พบบ่อย

บทเรียน “การคำนวณวันที่และช่วงเวลา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การคำนวณวันที่และช่วงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การคำนวณวันที่และช่วงเวลา”

บวกหรือลบช่วงเวลา และคำนวณความแตกต่างระหว่างวันที่ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การคำนวณวันที่และช่วงเวลา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคำนวณวันที่และช่วงเวลา
  2. การตัดและจัดกลุ่มวันที่
  3. การแยกวิเคราะห์และจัดรูปแบบสตริง
  4. เขตเวลาและประทับเวลา
← กลับไปที่ SQL Interview Prep