我需要计算一周后的周数。这对于一年中的大多数星期来说是微不足道的,但不是在年末/年初。例如,如果我需要知道2013年第52周之后的那一周。
我想使用defaul_week_format 3,即 a)星期一(而不是星期日)的星期开始 b)一年内的编号从1开始(而不是0) c)第1周是今年超过3天的第一周。
我的方法,例如计算一周后的第36周2014年如下:
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周!
我对此的唯一解释是:
如何强制MySQL函数str_to_date使用default_week_format?
或者:我怎样才能计算下周的数量? 我也可以在PHP中完成它,但是我从MySQL数据库中获得了数周的数字。
感谢您的帮助!
答案 0 :(得分:1)
我遇到了完全相同的问题。我的解决方案 - 也许不是最好的解决方案,但它确实有效。
正如您已经提到的:大多数案例都是微不足道的,您只需知道年末/开始。因此,我只需在下表中存储所需年数的相关周数:
CREATE TABLE `NEXT_WEEK_TAB` (
`CUR_WEEK` varchar(8) NOT NULL,
`NEXT_WEEK` varchar(8) NOT NULL,
PRIMARY KEY (`CUR_WEEK`,`NEXT_WEEK`)
)
现在使用当前算法获得接下来的一周:
following_week = (SELECT next_week
FROM next_week_tab
WHERE cur_week = <your_current_week>);
if !following_week then following_week++;
正如我所说:可能不是最好的解决方案,但它非常简单 - 而且有效。
答案 1 :(得分:0)
我认为你必须使用带模式参数的周
mysql> SELECT WEEK('2008-02-20',0);
-> 7
mysql> SELECT WEEK('2008-02-20',1);
-> 8
看看这里: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week