Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

หาผลรวมตัวเลขของปี (Sum of Digits) ใน MySQL

หลักการ: แยกตัวเลขแต่ละหลักแล้วบวกกัน

เช่น ปี 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 → 22
FLOOR(@year % 1000 / 100)2020 % 1000 = 20 → 20/100 = 0.2 → 00
FLOOR(@year % 100 / 10)2020 % 100 = 20 → 20/10 = 2 → 22
FLOOR(@year % 10)2020 % 10 = 00
รวม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