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;
我有一个跨越数年的大型数据集,但在获取诸如“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;