การคำนวณวันที่และช่วงเวลา
บวกหรือลบช่วงเวลา และคำนวณความแตกต่างระหว่างวันที่
การคำนวณวันที่และช่วงเวลา เป็นบทเรียน 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,DAYEXTRACT(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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคำนวณวันที่และช่วงเวลา
- การตัดและจัดกลุ่มวันที่
- การแยกวิเคราะห์และจัดรูปแบบสตริง
- เขตเวลาและประทับเวลา