我有一个类似的问题:我需要根据以下规则计算周数:
- 每周从周五开始
- 一年中的剩余天数(一年中最后一个星期五之后未完成一周的所有天数)应计入
明年的第一周。
例如:
- 27/12/2012(星期四)应该是 2012 年的第 52 周
- 28/12/2012(星期五)应该是 2013 年的第 1 周
- 2013 年第 1 周从 2012 年 12 月 28 日到 2013 年 3 月 1 日
我做了这个声明,根据这些规则计算 YEAR 和 WEEKNUMBER,您可以轻松地适应您的情况:
SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)),
IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));
棘手的部分就是这个表达式:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
其余的(If 子句)仅用于调整表达式的结果,使第 53 周的 year+1 和 week = 1。
我会尽力解释这个表达式。以下表达式为您提供了简单的周数(一年中的某一天除以一周中的 7 天,向上取整):
ceil(( dayofyear(current_date))/7)
但现在你想让它在星期五(或任何其他日子)开始。为此,您需要将第一周的天数添加到当前日期,这些天数是上一年的一部分(这就像您的当前实际上是几天前开始的,因为您的第一周包含前一年的天数)。
此表达式根据 1 月 1 日的工作日计算偏移量:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
偏移量是 7 与您希望一周开始的 weekdaynumber 之间的差:
- 0 代表星期六
- 周五 1 个
- 星期四 2 个
- 3 表示星期三
...
因此,现在您只需将其添加到前一个表达式即可得到上述表达式,该表达式计算从任何工作日开始的周数,并假设第 1 周从上一年开始:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
然后我添加了一个 IF,将第 53 周变为第 1 周,如果是第 53 周,则将另一个添加到年份。