尝试从数据库中选择最接近的上一个和下一个假日。比如,元旦总是在1月1日,新年前夜是在12月31日。当前年度完全不相关,所以我试图通过以下MySQL
查询按天和月(新年前夜)选择上一个假期:
SELECT * FROM `calendar` WHERE DATE_FORMAT(`holidayDate`, "%m-%d") < "01-01"
它给出了NULL。我原以为它会在12月份的前一个月中出现,但是......
尝试了很多不同的方法,但仍然没有成功。
P.S。:在这种情况下不能使用TIMESTAMP
......
答案 0 :(得分:1)
如果您可以接受两个查询:
SELECT max(holidayDate) as prev_holiday from calendar where holidayDate < now();
SELECT min(holidayDate) as next_holiday from calendar where holidayDate > now();
答案 1 :(得分:1)
它返回null的原因是因为没有任何小于'01 -01'。查询不会回到开头。
我要做的是写一个案例陈述,检查你是否在最早的假期。
如果您是最早的假期,那么您可以选择最新的假期(一种包裹的方式)。 如果您不是最早的假期,那么您需要选择之前的假期。我通过在降序日期命令它们并将其限制为1来做到这一点。(有效地抓住当前日期之前发生的假期。)
试试这个:
SELECT *
FROM calendar
WHERE
CASE WHEN DATE_FORMAT(CURDATE(), '%m-%d') = DATE_FORMAT((SELECT MIN(c.holidayDate) FROM calendar c), '%m-%d')
THEN holidayDate = (SELECT MAX(c.holidayDate) FROM calendar c)
ELSE
DATE_FORMAT(holidayDate, '%m-%d') < DATE_FORMAT(CURDATE(), '%m-%d')
END
ORDER BY holidayDate DESC
LIMIT 1;
这是一个SQL Fiddle示例。我创建了两个查询。一个使用当前日期(见上文)和一个使用Jan 1st硬编码来表明case语句确实有效。我只添加了一些假期来测试。