หลักการ: แยกตัวเลขแต่ละหลักแล้วบวกกัน
เช่น ปี 2020 → 2 + 0 + 2 + 0 = 4
วิธีคำนวณด้วยคณิตศาสตร์ (ไม่ต้องแปลงสตริง)
SET @year = 2020;
SELECT
FLOOR(@year / 1000) -- หลักพัน
+ FLOOR(@year % 1000 / 100) -- หลักร้อย
+ FLOOR(@year % 100 / 10) -- หลักสิบ
+ FLOOR(@year % 10) -- หลักหน่วย
AS SUM_OF_DIGITS_OF_YEAR;
ผลลัพธ์
+-----------------------+ | SUM_OF_DIGITS_OF_YEAR | +-----------------------+ | 4 | +-----------------------+
อธิบายแต่ละส่วน
| นิพจน์ | คำนวณ | ผลลัพธ์ (2020) |
|---|---|---|
| FLOOR(@year / 1000) | 2020 / 1000 = 2.020 → 2 | 2 |
| FLOOR(@year % 1000 / 100) | 2020 % 1000 = 20 → 20/100 = 0.2 → 0 | 0 |
| FLOOR(@year % 100 / 10) | 2020 % 100 = 20 → 20/10 = 2 → 2 | 2 |
| FLOOR(@year % 10) | 2020 % 10 = 0 | 0 |
| รวม | 4 |
วิธีอื่น: ใช้สตริง (MySQL 8.0+)
SET @year = 2020;
SELECT SUM(CAST(SUBSTRING(CAST(@year AS CHAR), n, 1) AS UNSIGNED)) AS sum_digits
FROM (
SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
) digits;
หรือสั้นกว่าด้วย RECURSIVE CTE:
WITH RECURSIVE digits AS (
SELECT 1 AS pos, CAST(@year AS CHAR) AS str
UNION ALL
SELECT pos + 1, str FROM digits WHERE pos < CHAR_LENGTH(str)
)
SELECT SUM(CAST(SUBSTRING(str, pos, 1) AS UNSIGNED)) FROM digits;
การประยุกต์: ตรวจสอบปีอธิกสุรทิน (Leap Year Check)
SELECT
@year AS year,
CASE
WHEN @year % 400 = 0 THEN 'Leap'
WHEN @year % 100 = 0 THEN 'Common'
WHEN @year % 4 = 0 THEN 'Leap'
ELSE 'Common'
END AS leap_year_type;
สรุป
- วิธีคณิตศาสตร์ (MOD, FLOOR) เร็วที่สุด เหมาะสำหรับปี 4 หลักคงที่
- วิธีสตริง ยืดหยุ่นกว่า รองรับปีที่ไม่ใช่ 4 หลัก (เช่น ปี 99, 100)
- MySQL ไม่มีฟังก์ชัน built-in สำหรับ sum of digits