mysql 中取得一年的周数,怎样才能和 excel 的 weeknum 函数一致

2017-11-10 17:41:19 +08:00
 wisefree
select week('2017-01-01', 3)

得到:52

weeknum("2017-01-01",2) 得到:1

每一年的第一天,都是第一周,这个逻辑是否可以在 mysql 中实现呢?


突然发现,python 中 datetime.date(2017, 1,1).isocalendar()[1],得到的也是 52

蒙圈了。。。请各位大 V 指教

5211 次点击
所在节点    MySQL
19 条回复
l00t
2017-11-10 17:54:05 +08:00
ISOCalendar 看周四的。周四在上一年,这周就算上一年的。周四在这一年,这周就算这一年的。
wisefree
2017-11-10 18:22:09 +08:00
@l00t 确实好像是和 ISO 8601 有关,但是有没有一个和 excel weeknum 一样方便的函数呢?
ping2
2017-11-10 20:37:01 +08:00
wisefree
2017-11-10 20:41:03 +08:00
@ping2 指定 mode,也不会有 weeknum 的效果
nekuata
2017-11-10 21:10:57 +08:00
select week(date_add('2017-1-1',interval 7 day),3);
手动加一周 /滑稽
wisefree
2017-11-10 21:13:41 +08:00
@nekuata 好像对所有年份的第一天,并不通用,>_<
ping2
2017-11-10 21:14:35 +08:00
@wisefree

> select week('2017-01-01', 2)\G
*************************** 1. row ***************************
week('2017-01-01', 2): 1
1 row in set (0.00 sec)
nekuata
2017-11-10 22:00:21 +08:00
@wisefree 加上三目..if 语句大概可以吧 /认真脸
select if(weekday('2017-01-01') <> 0, week(date_add('2017-1-1', INTERVAL 7 DAY), 3), week('2017-01-01', 3));
wisefree
2017-11-10 23:13:17 +08:00
@ping2 可能我表述有问题,2017-01-01 可以达到了 weeknum 的效果

但是呢?

2016-01-01,又有改 mode 么?
wisefree
2017-11-10 23:17:46 +08:00
@nekuata 想不到还挺复杂的,~_~
ping2
2017-11-10 23:49:41 +08:00
@wisefree 你说的那种肯定不对的,因为那样 W1 必然会有七天以上,那样就违背了 week num 的定义。mysql 文档上说得很清楚,你要不选择一种 mode 把指定开头的几天是 W0。
wisefree
2017-11-11 10:40:06 +08:00
@ping2 谢谢啦,我仔细看了下 mysql 文档
如果我想得到每一年第一天是第 1 周的效果,必须到日历上看看这一年第一天是星期几,然后选择想要的 mode

其实在 excel 中,并不需要这么复杂
每一年的第一天,肯定是第 1 周,所以我想要 excel weeknum 函数的效果
每一年的第一天,是第一周,每一年的第一天直至最近的星期天都是第一周,这更方便。
ping2
2017-11-11 14:01:34 +08:00
wisefree
2017-11-11 14:06:26 +08:00
@ping2 对,所以我一般用 excel 中的 weeknum(ex_date, 2),得到周数,基本都是用 system1

mysql 中有没有实现 excel 里的 system1 的功能呢
wisefree
2017-11-11 14:26:04 +08:00
@ping2 select week('2017-01-01',2),week('2017-01-02',2),week('2017-01-09',2)
得到 1,1,2
而我想得到的却是 1,2,3
ping2
2017-11-11 14:45:56 +08:00
@wisefree 这样的效果?

select week('2017-01-01', 5) + 1
wisefree
2017-11-11 14:55:41 +08:00
@ping2 select week('2014-01-01',3), week('2014-01-06',3),week('2014-01-13',3),是我想要的结果

但是如果换成 2017 年,这个有问题了,所以每一年的 mode 必须重新考虑选择

这一点让人有点苦恼。excel weeknum(ex_date, 2)是我需要的返回值
ping2
2017-11-11 16:03:51 +08:00
@wisefree 现状应该是大部分的后端都只实现 iso week number 和相关的方式。所以完全用 weeknum 的那个方式需要自己实现。
wisefree
2017-11-11 16:40:52 +08:00
@ping2 明白了,谢谢啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/405349

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX