建立純 T-SQL 純量函數 GetStar(@dt datetime),內含 12 星座起始月日常數表,利用 DATEADD 計算當年各星座起始日期,再找出小於等於輸入日期的最大起始日期對應星座。單一 SELECT 完成,無需程序邏輯。附測試查詢統計員工星座分布。
CREATE FUNCTION GetStar(@dt DATETIME)
RETURNS VARCHAR(100)
AS BEGIN
RETURN (
SELECT MAX(star) FROM (
SELECT '魔羯座' star, 1 [month], 1 [day] UNION ALL
SELECT '水瓶座', 1, 20 UNION ALL
SELECT '雙魚座', 2, 19 UNION ALL
SELECT '牧羊座', 3, 21 UNION ALL
SELECT '金牛座', 4, 20 UNION ALL
SELECT '雙子座', 5, 21 UNION ALL
SELECT '巨蟹座', 6, 22 UNION ALL
SELECT '獅子座', 7, 23 UNION ALL
SELECT '處女座', 8, 23 UNION ALL
SELECT '天秤座', 9, 23 UNION ALL
SELECT '天蠍座', 10, 24 UNION ALL
SELECT '射手座', 11, 22 UNION ALL
SELECT '魔羯座', 12, 22
) stars
WHERE @dt >= DATEADD(day, [day]-1, DATEADD(month, [month]-1, DATEADD(year, DATEDIFF(year, 0, @dt), 0)))
);
END;
SELECT dbo.GetStar(birthdate) AS 星座, COUNT(*) AS 人數
FROM employees
GROUP BY dbo.GetStar(birthdate);