我们的客户目前已在周六,周日或周一开始定义周数。遇到了这些DATE_FORMAT选项,可以很好地处理从周日和周一开始的一周,但是从星期六开始的周无法找到相同的方法。有什么建议?
%U Week (00..53), where Sunday is the first day of the week %u Week (00..53), where Monday is the first day of the week
答案 0 :(得分:3)
我有一个类似的问题:我需要根据以下规则计算周数:
例如:
我做了这个声明,根据这些规则计算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周使年+ 1和周= 1。
我会尽力解释这个表达方式。下面的表达式为您提供简单的周数(一年中的一天除以一周中的7天):
ceil(( dayofyear(current_date))/7)
但现在你想在周五(或任何其他日子)开始。要做到这一点,你需要添加到当天,即上一年的第一周的日子(就像你当前实际开始前几天,因为你的第一周包含上一年的天数)。 此表达式根据Jan / 1的工作日计算该偏移量:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
偏移量是7与您希望本周开始的工作日数之间的差异:
所以现在你只需要将它添加到前一个,导致上面提到的表达式计算从任何工作日开始的周数,并假设第一周从上一年开始:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
然后我刚刚添加了一个IF,它将第53周变为第1周,如果是53周,则将另一个IF添加到年份中。
答案 1 :(得分:2)
我花了一些时间思考这个问题。
ISO standard定义星期一开始的第一周,包含一年中的第4天。 MySQL的功能提供much more choices。
date_format()
标记%U
和%u
正在使用符号,其中第一周是第一周遇到星期日或星期一的标记。由于这不符合ISO,我将提供两种变体。
如果您想计算从星期六开始的周数和第一年的星期是包含星期六的星期,您可以使用以下表达式之一:
SELECT sign(dayofweek(current_date) - 7) + ceil(dayofyear(current_date)/7);
SELECT ceil((dayofyear(current_date)+
(dayofweek(date_format(current_date, '%Y-01-01'))%7-7))/7);
如果第一年的一周是一年中第四天的一周,请使用:
SELECT ceil((dayofyear(current_date)+
(dayofweek(date_format(current_date, '%Y-01-04'))%7-4+1))/7);
第一个表达非常简单。
我将详细说明第二和第三个。我通过计算一年中的当前日期,除以7和天花板来计算周数,非常简单。需要根据年初的情况调整周数。
0
日,然后调整日 - 差异的年份。这使得在第一个星期六之前的所有日子产生负调整数,并且它最终归结为零; 0
公式调整了1月/ 4日之前的第一个星期六,-4+1
用作一年中从1开始的日期,而不是从0开始。负调整意味着一年中的第一天不在一年中的第一周。以下是SQL Fiddle上的一些测试日期。
如果您想要计算其他任何一天的周数,您只需更改公式,使该日期在序列中为+1
。比如,从星期三开始数周,请使用:
0
使用 SELECT ceil((dayofyear(current_date)+
((dayofweek(date_format(current_date, '%Y-01-04'))+3)%7-4+1))/7);
,因为它补充了星期三到7的+3
值。
答案 2 :(得分:0)
根据DAYOFWEEK()
进行调整。