我搜索了答案,虽然我在网上找到了类似问题的答案,但我无法将它们用于我的目的。我需要帮助。
我正在构建一个支持重复事件的日历。我快完成了,但最后一 block 是最难的。我需要能够支持在每 Y 个月的第 N 个 X 发生的事件,其中 X 是给定的工作日,Y 是月份数。
我已经计算出“每 Y 个月”部分(即下面查询段中倒数第二行)。我只需要获得“第 N 个工作日”。
我发现有人创建了一个 PHP 脚本,声称可以很好地解决这个问题,我打算使用它,但后来我意识到这必须完全在 MySQL 查询中完成,因为指定获取日期的工作日的值是数据库记录的一部分,我无法让它们在主查询之外使用。
这是查询的一部分,因此您可以了解我的目标:
WHEN event_recurring_pattern_type = 'monthly' AND event_recurring_monthly_type = 'dayxofeveryxmonths' THEN
MOD(PERIOD_DIFF(CONCAT(event_date_year,event_date_month), CONCAT('$date_year','$date_month')), event_recurring_monthly_dayofeveryxmonths) = 0
AND event_recurring_monthly_dayx = '$date_day'
WHEN event_recurring_pattern_type = 'monthly' AND event_recurring_monthly_type = 'thexweekdayofeveryxmonths' THEN
MOD(PERIOD_DIFF(CONCAT(event_date_year,event_date_month), CONCAT('$date_year','$date_month')), event_recurring_monthly_dayofeveryxmonths) = 0
AND '$date_timestamp' = {the date of the Nth weekday of $date_month}
最后一行应该将日历的当前输出日期(因为它一次构建日历一天)与我们在输出过程中任何月份的第 N 个工作日的日期进行比较。当它们匹配时,该事件将输出到日历上。
在这种情况下,$date_timestamp 是“YYYY-MM-DD”格式的当前输出日期,因此我获取日期的第 N 个工作日也应该采用该格式。
如果我没有提供足够的信息,或者如果这个问题在其他地方得到了充分的回答,请告诉我。我之前的一个问题被“关闭”了,因为有些人认为它太模糊或没有提供足够的信息,即使我提供了很多与我的问题相关的信息并且仍然收到了一个完全可以接受的解决我的问题的答案。在执行负面操作之前,如有必要,请给我机会改进问题。
提前致谢。
哦,是的,如果可以进一步创建它以有选择地获取给定月份的最后一个指定工作日,那就更好了。 PHP 脚本做到了这一点,但正如我所说,这次我不能用 PHP 做到这一点。
最佳答案
使用 DAYOFWEEK() :
WHEN event_recurring_pattern_type = 'monthly'
AND event_recurring_monthly_type = 'thexweekdayofeveryxmonths'
THEN MOD(
PERIOD_DIFF(
CONCAT(event_date_year,event_date_month),
CONCAT('$date_year','$date_month')
), event_recurring_monthly_dayofeveryxmonths
) = 0
AND DAYOFWEEK('$date_timestamp') = event_recurring_monthly_dayofweek
以上假定添加了 event_recurring_monthly_dayofweek
列,但您可以轻松地重新使用 event_recurring_monthly_dayx
列来存储星期几整数。
关于mysql - 如何在 MySQL 查询中获取给定月份的第 N 个工作日的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128072/