我要去把我的两分钱在这里与得到它基于发现每一天的1日第三个选项,然后添加7的倍数以获得最终结果。
功能
CREATE FUNCTION `ISNTHDAYINMONTH`(checkDate DATE, weekNumber INTEGER, dayOfWeek INTEGER, monthOfYear INTEGER) RETURNS INTEGER
NO SQL
DETERMINISTIC
BEGIN
DECLARE firstOfMonth DATE;
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
IF DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear #Make sure at least this matches
AND DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1)) THEN #When the date matches the nth dayOfWeek day of the month
RETURN 1;
ELSE
RETURN 0; #Nope
END IF;
END
使用
SELECT ISNTHDAYINMONTH(datecol, weekNumber, dayOfWeek, monthOfYear);
凡weekNumber是1至5,星期为1至7(1 =星期日),和monthOfYear是1至12。
示例
要检查是否datecol为4月的第二个星期二:
SELECT ISNTHDAYINMONTH(datecol, 2, 3, 4);
计算
让我们来分析一下。此行得到了一个月的第一天是在通过的日期。
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
此检查可确保日期有星期的正确日子,正确的月份(以防万一用户在通过日期甚至不是一周的正确日期)。
DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear
现在的大单:
DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1))
要得到我们需要添加到1来获得日期的金额,计算一周中的某天,我们正在寻找,减去星期几那个月的第一天就会得到偏移量mod 7((dayOfWeek - DayOfWeek(first))%7)。
请注意,由于本月的第一个月可能会在我们正在查看的前一天或某一天出现,因此我们会再增加一个7,然后再增加7。这是需要的,因为MySQL的Mod功能不能正确计算mod。即-1%7应该是6,但是MySQL返回-1。加7和取模可确保结果总是正确的。
总结:
NumberToAddToOneToGetDateOfFirstWeekDay = (7 + DayOfWeek - DayOfWeek(firstDayOfMonth)) %
然后,我们添加一个需要的7每一好几倍怎么去正确的一周。
@Dancrumb无论今天是哪一天。 –
老实说,如果你需要做这样的查询,我会简单地建立一个可以做查找的日期的表格。类似于在数据仓库中创建日期维度表的方式。像这样的https://gist.github.com/johngrimes/408559请阅读这里了解更多关于维度表的内容(请参阅常见模式部分)http://en.wikipedia.org/wiki/Dimension_%28data_warehouse%29 –