【问题标题】:Find the N:th Monday in a month with MySQL使用 MySQL 查找一个月中的第 N 个星期一
【发布时间】:2012-09-24 19:33:05
【问题描述】:

如何在 MySQL 中根据 @ref_date@n@week_day 找到一个月的第 n 个工作日:

SET @ref_date = '2012-09-25';
SET @n = 3; #The third week
SET @week_day = 0; #Monday

结果应该是:2012-09-17

任何建议表示赞赏。

【问题讨论】:

  • 请注意@ref_date 和@n 的某些值可能会导致'no-way' 解决方案,例如@ref_date='2012-09-25' 和@n=1
  • 请提供更多的预期结果
  • @LuisSiquot,OP 只是使用@ref_date 来表示一个月。所以@n=1 表示 2012 年 9 月的第一周。

标签: mysql


【解决方案1】:

您有@weekday 使用标准'0 == Monday',但MySql 使用基于1 的标准'1 == Sunday'。假设我们必须说 0 必须等于星期一,您可以这样做:

SET @first_day = DATE_SUB(@ref_date, INTERVAL DAYOFMONTH(@ref_date) - 1 DAY);
SET @first_day_of_week = (DAYOFWEEK(@first_day) - 2) % 7;
SET @solution = DATE_SUB(DATE_ADD(@first_day, INTERVAL @n WEEK), INTERVAL ( 7 - ((@week_day - @first_day_of_week + 7) % 7) ) DAY);

所以作为一个单一的查询:

SELECT DATE_SUB( DATE_ADD( DATE_SUB( @ref_date, INTERVAL DAYOFMONTH(@ref_date) - 1 DAY),  INTERVAL @n WEEK), INTERVAL ( 7 - ((@week_day - ((DAYOFWEEK(DATE_SUB( @ref_date, INTERVAL DAYOFMONTH(@ref_date) - 1 DAY)) - 2) % 7) + 7) % 7) ) DAY);

【讨论】:

  • 如果我想获得 2012 年 9 月第 3 周的“星期一”(即 2012-09-10),这可以正常工作,但我想要的是:2012 年 9 月的第 3 个星期一(是 2012 年 9 月 17 日)。我正在尝试改变它。
  • 我原以为 MOD 会修复负数,但显然没有。现已修复。
  • 这是一个很好的解决方案。我自己想出了一个办法,但这很优雅。非常感谢!
【解决方案2】:

在此处找到 SO 中的解决方案之一

SELECT  WEEK(dateField, 5) -
        WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1

阅读Week of the Month in Mysql

【讨论】:

  • 我只是想一想。也需要应用一些逻辑。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多