MySQL Query返回不正确的周数

时间:2015-08-08 22:46:37

标签: mysql mysqli

我在尝试通过mysql查询查询周数时遇到问题。

这是问题的一个例子

2015年8月2日是一个星期天,根据我检查的所有地方,根据非ISO标准,它应该属于第32周(ISO标准第31周)但我的查询要么给我,第30周(非ISO)或第31周(ISO)。我需要星期日成为一周的第一天。

WEEK('2015-8-2', 0) // Returns 31
WEEK('2015-8-2', 2) // Returns 31
WEEK('2015-8-2', 4) // Returns 31
WEEK('2015-8-2', 6) // Returns 31

模式1,3,5,7将于2015年8月2日返回30。

我也使用了WEEKOFYEAR('2015-8-2'),它也返回31。

我不知道为什么它不会给我32而不必在查询中添加+1。

WEEKOFYEAR('2015-8-2') + 1

那么做WEEKOFYEAR(日期)+ 1或WEEK(日期,2)+ 1查询是否安全?

我错误地认为2015年8月2日是NON-ISO标准的第32周?

2 个答案:

答案 0 :(得分:2)

星期天总是一周的第一天。我们同意这一点。 (第一周除外:>)

以下是周()的Manual页面。

2015年1月1日是星期四。第一个星期天是2015年1月4日。

这些都返回0:

select WEEK('2015-1-1', 0);
select WEEK('2015-1-2', 0);
select WEEK('2015-1-3', 0);

这些都返回1:

select WEEK('2015-1-4', 0);
select WEEK('2015-1-5', 0);
select WEEK('2015-1-6', 0);
select WEEK('2015-1-7', 0);
select WEEK('2015-1-8', 0);
select WEEK('2015-1-9', 0);
select WEEK('2015-1-10', 0);

这是模式0的本质。

来自手册:

  

如果包含1月1日的一周在新的一年中有4天或更多天,   这是第1周。

     

否则,它是上一年的最后一周,也是下一周   是第1周。

但无论如何,手册页显示模式0的范围始终为0到53。

select WEEK('2013-12-31', 0); -- 52
select WEEK('2014-12-31', 0); -- 52
select WEEK('2015-12-31', 0); -- 52
select WEEK('2016-12-31', 0); -- 52
select WEEK('2017-12-31', 0); -- 53  < ----- Look at me !
select WEEK('2018-12-31', 0); -- 52
select WEEK('2019-12-31', 0); -- 52

select WEEK('2013-01-01', 0); -- 0
select WEEK('2014-01-01', 0); -- 0
select WEEK('2015-01-01', 0); -- 0
select WEEK('2016-01-01', 0); -- 0
select WEEK('2017-01-01', 0); -- 1  < ----- Look at me !
select WEEK('2018-01-01', 0); -- 0
select WEEK('2019-01-01', 0); -- 0

编辑:

模式3

select WEEK('2014-12-21', 3); -- 51 Sun
select WEEK('2014-12-22', 3); -- 52 Monday
select WEEK('2014-12-28', 3); -- 52 Sunday
select WEEK('2014-12-29', 3); -- 1 Monday
select WEEK('2014-12-30', 3); -- 1 T
select WEEK('2014-12-31', 3); -- 1 W
select WEEK('2015-01-01', 3); -- 1 T
select WEEK('2015-01-02', 3); -- 1 F
select WEEK('2015-01-03', 3); -- 1 Sat
select WEEK('2015-01-04', 3); -- 1 Sunday
select WEEK('2015-01-05', 3); -- 2 Monday

答案 1 :(得分:1)

所以我最终放弃了尝试让每年只计算52周,因为每隔5。6年就会有53周(或仅一天)的一年。

所以,为了让我的生活更轻松并遵循标准(除了我需要一周总是在星期日而不是星期一开始),我正在运行以下查询。

YEARWEEK(DATE_ADD(date, INTERVAL 1 DAY), 3);

它的作用是返回周数与年份对应,但使用星期日作为一周的第一天而不是星期一。例如。

YEARWEEK(DATE_ADD('2015-8-9', INTERVAL 1 DAY, 3)

返回

201532

现在这不是最好的方法,因为我确信可能有其他更准确的方法,但这个方法有效。因此,每当我选择一个星期日时,它会在查询结果中再增加一天,将日期带到星期一,按ISO标准,这是一周的第一天。

另一种方法如下。

IF(DAYOFWEEK(Date) = 1, YEARWEEK(DATE_ADD(date, INTERVAL 1 DAY), 3), YEARWEEK(date, 3))

这样,当查询的日期是星期日时,它只会添加额外的一天。

我会选择第二种方法,因为我发现它更准确,因为星期一将永远属于有问题的一周。

希望这有助于其他人。