如何计算下周的数量?

时间:2014-02-10 22:46:32

标签: php mysql str-to-date

我需要计算一周后的周数。这对于一年中的大多数星期来说是微不足道的,但不是在年末/年初。例如,如果我需要知道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周!

我对此的唯一解释是:

  • week()将default_week_format纳入帐户
  • str_to_date()忽略default_week_format

如何强制MySQL函数str_to_date使用default_week_format?

或者:我怎样才能计算下周的数量? 我也可以在PHP中完成它,但是我从MySQL数据库中获得了数周的数字。

感谢您的帮助!

2 个答案:

答案 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