我需要计算给定星期之后的星期数。在一年中的大多数星期中,这都是微不足道的,但在年底/年初则不是这样。例如,如果我需要知道2013年第52周的下一周。

我想使用defaul_week_format 3,即
a)从星期一开始的星期(而不是星期日)
b)一年内的编号以1(而不是0)开头
c)第一周是今年的第一周,超过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数据库中获得了几周的数字。

谢谢你的帮助!

最佳答案

我面临着完全相同的问题。我的解决方案-也许不是最好的解决方案,但是它可以工作。

正如您已经提到的:大多数情况都是微不足道的,您只需要知道年结/开始。因此,我只将下表中需要的年数存储在下表中:

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++;


正如我所说:可能不是最好的解决方案,但这很简单-而且可行。

关于php - 如何计算下周的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21689483/

10-11 02:49