我需要计算给定一周之后的周数。这对于一年中的大多数星期来说都是微不足道的,但在年底/年初却不是这样。例如,如果我需要知道 2013 年第 52 周之后的一周。
我想使用defaul_week_format 3,即a)周从星期一(而不是星期日)开始b)一年内的编号从1(而不是0)开始,c)第1周是第一周超过今年3天。
例如,我计算 2014 年第 36 周后一周的方法如下:
SELECT WEEK(DATE_ADD(STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W'), INTERVAL 1 WEEK))
对于这个例子,我计算第 36 周星期二的日期,加上一周,然后计算这一天的星期几。这会起作用,但即使不增加一周,我也会有这种奇怪的行为:
它适用于 default_week_format 0:
SET @@local.default_week_format=0;
SELECT STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W');
-> Tuesday of week 36 is 2014-09-09
SELECT week('2014-09-09');
-> 2014-09-09 is in week 36
到目前为止,一切都很好:第 36 周的星期二是第 36 周。
但是这个简单的实验不适用于 default_week_format 3:
SET @@local.default_week_format=3;
SELECT STR_TO_DATE('W36 2014 Tuesday', 'W%V %X %W');
-> Tuesday of week 36 is 2014-09-09
-> This is wrong, because numbering should start with 1 (instead of 0 now)!
-> Tuesday of week 36 should be 2014-09-02
SELECT week('2014-09-09');
-> 2014-09-09 is in week 37
所以 MySQL 告诉我第 36 周的星期二是第 37 周!
我对此的唯一解释:
- week() 将 default_week_format 考虑在内
- str_to_date() 忽略 default_week_format
如何强制 MySQL 函数 str_to_date 使用 default_week_format?
或者:我还能如何计算下一周的数量?我也可以用 PHP 来做,但是我从 MySQL 数据库中得到了几周的数字。
谢谢你的帮助!