我有一个具有以下结构的 MySQL 表:
id | date | type | description
---------------------------------------------------
0 | 1979-09-20 | 'bday' | 'Birthday Employee1 '
1 | 1984-05-04 | 'bday' | 'Birthday Employee2 '
2 | 1989-01-04 | 'bday' | 'Birthday Employee3 '
3 | 2013-10-10 | 'visit' | 'Visit of Visitor1 '
此表应处理员工门户中所有即将发生和过去的事件。有两种不同类型的事件;生日和访问。这些在列类型中被声明为字符串。生日应该只输入一次,而不是每年,所以需要一个复杂的查询来处理这种情况:
SELECT * ,
CASE type
WHEN 'bday'
THEN
(CASE
WHEN ADDDATE( date, INTERVAL YEAR( NOW( ) ) - YEAR( date ) YEAR )< NOW()
THEN ADDDATE(ADDDATE(datum,INTERVAL YEAR(NOW())- YEAR(date) YEAR),
INTERVAL 1 YEAR)
ELSE ADDDATE( date, INTERVAL YEAR( NOW( ) ) - YEAR( date ) YEAR )
END)
ELSE date
END
AS dates
FROM events
WHERE date > NOW() AND type='visit' OR ADDDATE(date, INTERVAL
YEAR NOW())-YEAR( date ) YEAR) > NOW() AND type='bday'
ORDER BY dates ASC
LIMIT 0 ,10
这个查询对我不起作用,因为我在括号中添加了嵌套的 case 子句。我将其替换为以下行
ADDDATE( date, INTERVAL YEAR( NOW( ) ) - YEAR( date ) YEAR )
这行得通,但问题是 - 正如您在嵌套的 CASE 子句中看到的那样 - 不会选择最近一年已经发生的生日。因此,额外 CASE 的目的是确定年份应该是 2013 年还是 2014 年(如果它已经发生在 2013 年)。
这对于一年中前两周的生日非常重要。提醒通知必须在前一年已经看到,否则没有多大意义。
所以实际上我只需要弄清楚为什么嵌套的 CASE 子句不起作用。也有可能显然有更简单的方法来解决这个问题,但现在我看不到它们。