MySQL 选择周数和年份会导致一年中的最后一周出现问题

MySQL selecting week number and year causes problems with last week of year

我有一个跨越数年的大型数据集,但在获取诸如“53-2016”(2016 年第 53 周)之类的字符串时遇到问题。

我的查询是:

SELECT 
  date,
  DATE_FORMAT(date, "%v-%Y") AS week,      
FROM myTable
GROUP BY week
ORDER BY date;

使用此查询,我得到了两行,而我只想得到一行。

这是因为 GROUP BY week。在 2015 年底,日期:12 月 28 日至 31 日被添加到 53-2015 周,而该周的其余时间(1 月 1-3 日)被添加到名为 53-2016 的行中。

有什么方法可以将一月的前三天添加到组 53-2015 中吗?

是的,你可以做到。 执行以下操作

SELECT 
  date,
  DATE_FORMAT(DATE_SUB(date, INTERVAL MOD(DAYOFWEEK(`date`) +5,7) DAY ), "%v-%Y") AS week
FROM myTable
GROUP BY week
ORDER BY date;

这将查询星期几,并将减去天数,因此基本上每一天都被截断为前一个星期一

像这样的事情怎么样(做更多测试...)?

#DROP TABLE TT1;
CREATE TABLE TT1 (date datetime);

INSERT INTO TT1 values ('2015-12-31');
INSERT INTO TT1 values ('2016-01-01');
SELECT 
  date,
    CONCAT( DATE_FORMAT(date, "%v")  , '-', CASE WHEN DATE_FORMAT(date, "%v")>52 AND DATE_FORMAT(date, "%m")=1 THEN DATE_FORMAT(date, "%Y")-1 ELSE DATE_FORMAT(date, "%Y") END ) AS week      
FROM TT1;

DROP TABLE TT1;

输出:

    date    week
1   31.12.2015 00:00:00 53-2015
2   01.01.2016 00:00:00 53-2015

最后我自己弄明白了。

原来 MySQL 有第二种方法可以在 DATE_FORMAT() 中打印年份。

%x - Year for the week where Monday is the first day of week, four digits, used with %v

这解决了问题,我的查询结果为:

SELECT 
  date,
  DATE_FORMAT(date, "%v-%x") AS week,      
FROM myTable
GROUP BY week
ORDER BY date;