資料表含 birthday (DATE 型別),需查詢年齡大於、等於、小於指定值 N 的記錄,精確到天。
年齡 = 當前日期與生日的年份差,再根據「今年生日是否已過」微調:
SELECT *,
TIMESTAMPDIFF(DAY, birthday, CURDATE()) DIV 365 AS age_years
FROM users;
-- 年齡 > N
SELECT * FROM users
WHERE TIMESTAMPDIFF(DAY, birthday, CURDATE()) > N * 365.25;
-- 年齡 = N (精確到天)
SELECT * FROM users
WHERE TIMESTAMPDIFF(DAY, birthday, CURDATE()) BETWEEN N * 365.25 AND (N+1) * 365.25 - 1;
-- 年齡 < N
SELECT * FROM users
WHERE TIMESTAMPDIFF(DAY, birthday, CURDATE()) < N * 365.25;
-- 計算精確年齡(歲)
SELECT FLOOR(DATEDIFF(CURDATE(), birthday) / 365.25) AS age
FROM users;
age 欄位並建立索引,透過排程/觸發器每日更新。YEAR(birthday)),導致索引失效;改用範圍查詢:birthday BETWEEN DATE_SUB(CURDATE(), INTERVAL (N+1) YEAR) AND DATE_SUB(CURDATE(), INTERVAL N YEAR)。善用 MySQL 日期時間函數,能簡潔實現精確年齡計算與篩選。