我在尝试通过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周?
答案 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
编辑:
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))
这样,当查询的日期是星期日时,它只会添加额外的一天。
我会选择第二种方法,因为我发现它更准确,因为星期一将永远属于有问题的一周。
希望这有助于其他人。