我需要计算给定星期之后的星期数。在一年中的大多数星期中,这都是微不足道的,但在年底/年初则不是这样。例如,如果我需要知道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/