Вариант для mySQL, возможно не самый лучший
[sql]
SELECT dob, @zodiac_number := CASE
WHEN dob IS NULL THEN NULL
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-03-21")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-04-20")) THEN 1
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-04-21")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-05-21")) THEN 2
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-05-22")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-06-21")) THEN 3
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-06-22")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-07-23")) THEN 4
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-07-24")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-08-23")) THEN 5
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-08-24")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-09-23")) THEN 6
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-09-24")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-10-23")) THEN 7
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-10-24")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-11-22")) THEN 8
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-11-23")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-12-21")) THEN 9
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-12-22")) OR
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-01-20")) THEN 10
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-01-21")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-02-19")) THEN 11
WHEN TO_DAYS(dob) >= TO_DAYS(CONCAT(YEAR(dob), "-02-20")) AND
TO_DAYS(dob) <= TO_DAYS(CONCAT(YEAR(dob), "-03-20")) THEN 12
END AS zodiac_number,
ELT (@zodiac_number, "овен", "телец", "близнецы", "рак", "лев", "дева", "весы", "скорпион", "стрелец", "козерог", "водолей", "рыбы") AS zodiac_sign
FROM `users`
[/sql]