从MySQL查询中排除特定假期

时间:2012-11-26 20:03:00

标签: php mysql datetime

我有这个查询,我用来从我的数据库中提取记录:

SELECT dateAdded, claimedDate, TIMESTAMPDIFF(SECOND, dateAdded, claimedDate) AS output FROM leads 
WHERE HOUR(dateAdded) >= '9' 
AND HOUR(dateAdded) < '18' 
AND DAYOFWEEK(dateAdded) != 7 
AND DAYOFWEEK(dateAdded) != 1

目前,我目前只选择时间戳在周一至周五上午9:00到下午5:00之间的记录。我还需要能够排除以下主要假期:元旦,阵亡将士纪念日,独立日,劳动节,感恩节和圣诞节。

我需要一直排除这些假期。例如,查询应排除在11月的第四个星期四(感恩节)发生的所有记录,无论年份如何。

这不一定需要仅限MySQL的解决方案。如果更容易做一个混合的PHP / MySQL解决方案,也会很有效。谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

您需要一张符合“假期”标准的日期表,然后JOIN到该表。

Here's an example

否则,您只需要将它们排除在外......

... WHERE dateAdded NOT IN ('2012-07-04', ...)

<强>更新

This solution使用JOIN来省略假期。

答案 1 :(得分:0)

您可以创建一个函数is_holiday,然后将其添加到select语句中。这样。

CREATE DEFINER=`root`@`localhost` FUNCTION `is_holiday`(nDate Date) RETURNS tinyint(1)
BEGIN
declare isholiday boolean;
set isholiday = false;

if month(nDate)=1 and day(nDate)=1 then set isholiday = true;
elseif month(nDate)=7 and day(nDate)=4 then set isholiday = true;
elseif month(nDate)=12 and day(nDate)=25 then set isholiday = true;
elseif month(nDate)=9 and day(nDate) between 1 and 7 and weekday(nDate) = 0 then set isholiday = true;
elseif month(nDate)=11 and day(nDate) between 22 and 28 and weekday(nDate) = 3 then set isholiday = true;
end if;

RETURN isholiday;
end

添加到您的代码...

and not is_holiday(dateAdded)